我实际上已经完成了一个,但想将我的与一个经过充分研究的可能的学术算法进行比较。可能有一个统计对象库,可以直接或组合解决我的特殊需求。
我的系统(我打算开源)有一个 NetFlow 数据流。与其存储在数据库中并使用 SQL 函数,我更喜欢拥有一个无数据库系统并维护一组统计信息,为每个新流更新,并每秒滚动(或更高)。
我的解决方案涉及单个 uint 数组,以有效地创建大小为 [60、59、23、6、...] 的锯齿状数组,代表秒、分钟、小时、天、周等。
每个插槽包含该时间的总字节数。因此,在 60 秒后,将创建一个单分钟统计信息作为 Avg(seconds)。当然,这在时间尺度上会持续相对较长。
不是简单地有数千秒的增量,而是由于:
- 内存限制和拥有更多统计节点的潜力;和
- 向用户理想的展示
...我卷起时间尺度。
鉴于一个流可能应用于统计层次结构中的多个节点(WAN 链接、IP 地址、目标地址、SourcePort-DestinationPort),我计算了一次增量(GenerateDelta),然后简单地应用于每个既活跃又活跃的节点与流元数据匹配。
在以下潜在情况下,将“滚动”给定节点上的统计信息:
- 被读取/显示时(通过 HTTP\JSON AJAX 请求)
- 应用增量时(由于相关流程)
- 只需每 n 秒(n 通常为 1)
总体而言,可能有一个完善的算法来保持随时间推移的运行总数(以秒、分钟......)。但如果做不到这一点,也可能有合适的算法来比较我的代码的较小子部分:
- GenerateDelta - 不太可能,因为这专门用于分解和平均统计数组中插槽上的持续时间的流。
- 滚动 - 如果只有几秒钟,那么这当然很简单,但是我的解决方案要求每 60 秒将 60 秒组合成一个新的分钟总数,依此类推。
我不希望响应者提出任何他们自己的算法,我已经(几乎)完成了我自己的所有算法,没有任何问题并且考虑了许多性能。当我完成并作为开源发布后,其他人可能会看到我的算法。
我希望看到的是任何“完善”的比较算法。也许我的会更好,也许我的会更糟。谷歌不擅长这类问题,我需要你的帮助。
谢谢!