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

时间:2013-10-15 16:44:19

标签: algorithm data-structures jvm sliding-window

我正试图按照移动平均线的方式实施某些内容。

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

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

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

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

1 个答案:

答案 0 :(得分:8)

问题描述和问题冲突:所描述的不是移动平均线,因为每个时间段的平均值是不同的。 (“我需要计算每个时期的平均值。”)因此,我们承认了一个非常简单的解决方案:

  

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

     

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

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

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

在每个计算周期结束时:

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

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