随时间推移的滑动窗口 - 数据结构和垃圾收集

Kur*_*tis 9 algorithm jvm sliding-window data-structures

我试图实现移动平均线的某些东西.

在该系统中,不保证每个时间段的整数数量.我需要计算每个时期的平均值.因此,我不能简单地按数量滑过整数列表,因为这与时间无关.

我可以记录每个值及其相关时间.我们将通过系统运行大量数据,因此"垃圾收集"旧数据非常重要.

值得注意的是,我需要在每个周期结束后将平均值保存到磁盘.但是,在将数据保存到磁盘和引入新时段的数据之间可能会有一些重叠.

我可以使用哪些高效的数据结构来存储,滑动和垃圾收集这类数据?

ric*_*ici 8

问题描述和问题冲突:所描述的不是移动平均线,因为每个时间段的平均值是不同的.("我需要计算每个时期的平均值.")因此,我们承认了一个真正无关紧要的解决方案:

对于每个时期,保持计数和观察总和.

在该期间结束时,计算平均值

我怀疑实际需要的是:每秒(计算周期),我想知道过去一分钟(聚合期)的平均观察.

这可以通过桶的循环缓冲区简单地解决,每个桶表示一个计算周期的值.会有aggregation period / computation period这样的水桶.同样,每个桶包含一个计数和一个总和.此外,保持当前总数/总和和累计总和/计数.每个观察值都加到当前总数/总和上.

在每个计算周期结束时:

  • 从累计和/计数中减去(循环)第一个周期的总和/计数
  • 将当前总和/计数添加到累计总和/计数
  • 根据累计金额/计数报告平均值
  • 用当前的总和/计数替换第一个句点的值
  • 清除当前的金额/计数
  • 提前循环缓冲区的来源.

如果您确实需要能够在某个给定时间段内在以前观察的所有平均值的任何时间进行计算,则需要更复杂的数据结构,基本上是可扩展的循环缓冲区.然而,这种精确的计算实际上很少是必要的,并且根据上述算法的块状近似通常足以用于数据目的,并且在长期内用于存储器管理更加可持续,因为其存储器要求从一开始就是固定的. .