3

ログ レコードを保存するときに、さまざまなカテゴリの移動平均を合計したいと考えています。Web サーバーのログを一度に 1 エントリずつ保存するサービスを想像してみてください。さらに想像してみましょう。ログに記録されたレコードにアクセスできません。そのため、それらは一度表示されますが、後でアクセスすることはできません。

別のページについて知りたい

  • 総ヒット数(簡単)
  • 「最近の」平均 (1 か月程度)
  • 「長期」平均 (1 年以上)

膨大な量のデータを合計して再計算することなく、そのような移動平均を保存できる巧妙なアルゴリズム/データ モデルはありますか?

正確な平均 (正確には 30 日程度) は必要ありませんが、傾向指標だけが必要です。したがって、多少のぼやけはまったく問題ではありません。新しいエントリが古いエントリよりも高く重み付けされるようにする必要があります。

おそらく 1 つの解決策は、毎月の統計レコードを自動作成することです。ただし、過去 1 か月の統計すら必要ないので、これはやり過ぎのように思えます。そして、それは私に移動平均を与えるのではなく、毎月新しい値に交換します.

4

3 に答える 3

6

簡単な解決策は、指数関数的に減衰する合計を維持することです。

次の式を使用して計算できます。

newX = oldX * (p ^ (newT - oldT)) + delta

ここoldXで、は合計の古い値(時間oldT)、newXは合計の新しい値(時間newT)です。delta合計に対する新しいイベントの寄与です(たとえば、今日のヒット数)。pは1以下であり、減衰係数です。を取るp = 1と、ヒットの総数が得られます。を減らすことによりp、合計が表す間隔を効果的に減らします。

于 2011-11-21T12:18:04.140 に答える
1

与えられた時定数で平滑化された値だけが本当に必要な場合、最も簡単な方法は、単極再帰IIRフィルター(時系列分析ではARまたは自己回帰フィルター)を使用することです。これは次の形式を取ります。

Xnew = k * X_old + (1 - k) * x

ここX_oldで、は以前の平滑化された値、X_newは新しい平滑化された値、xは現在のデータポイント、kは時定数を決定する係数です(通常は小さい値、<0.1)。サンプルレートに基づいて、2つのk値(「最近」の場合は1つの値、「長期」の場合は小さい値)を経験的に決定する必要がある場合があります。これは、理想的には適度に一定である必要があります。たとえば、1日1回の更新です。

于 2011-11-21T12:16:37.247 に答える
0

それはあなたにとって解決策かもしれません。

時間または日ごとにグループ化された中間ストレージにデータを集約できます。少量のレコードをグループ化する必要があり、挿入も高速になるため、グループ化機能は非常に高速に動作します。正確な決定はあなた次第です。

計算内容を簡単に理解でき、各ステップで計算する必要がないため、自己相関指数アルゴリズムよりも優れている可能性があります。

前期のデータについては、限られた量のレコードで上限付きコレクションを使用できます。これらは、MongoDB などの一部の DB でネイティブにサポートされています。

于 2011-11-21T13:05:31.263 に答える