問題の説明と質問の矛盾: 説明されているのは移動平均ではありません。各期間の平均は異なるからです。(「各期間の平均を計算する必要があります。」)したがって、本当に簡単な解決策が認められます。
期間ごとに、カウントと観測値の合計を維持します。
期間の終わりに、平均を計算します
実際に求められているのは次のようなものだと思います: 毎秒 (計算期間)、過去 1 分間 (集計期間) の平均観測値を知りたいです。
これは、それぞれが 1 つの計算期間の値を表すバケットの循環バッファーで簡単に解決できます。そのようaggregation period / computation period
なバケツがあります。繰り返しますが、各バケットにはカウントと合計が含まれています。また、現在の合計/合計と累積合計/カウントが維持されます。各観測値は、現在の合計/合計に追加されます。
各計算期間の終わりに:
- 累積合計/カウントから (循環的に) 最初の期間の合計/カウントを差し引く
- 現在の合計/カウントを累積合計/カウントに追加します
- 累積合計/カウントに基づいて平均を報告する
- 最初の期間の値を現在の合計/カウントに置き換えます
- 現在の合計/カウントをクリアする
- 循環バッファの原点を進めます。
特定の期間の以前の観測のすべての平均をいつでも計算できるようにする必要がある場合は、基本的に拡張可能な循環バッファーである、より複雑なデータ構造が必要になります。ただし、そのような正確な計算が実際に必要になることはめったになく、上記のアルゴリズムのように、バケット化された近似は通常、データの目的には十分であり、メモリ要件が最初から固定されているため、メモリ管理の長期にわたってはるかに持続可能です。 .