データロギングアプリケーションがあります。30 秒ごとに 10,000 の温度を記録します。10,000 個のアイテムのそれぞれの最小/最大/平均温度を、1 時間ごと/毎日/毎週ベースで計算できる必要があります。最小/最大/平均の計算はサーバーで実行できますか?それとも、計算を実行するために各ドキュメントをクライアントにダウンロードする必要がありますか?
アンドリュー
データロギングアプリケーションがあります。30 秒ごとに 10,000 の温度を記録します。10,000 個のアイテムのそれぞれの最小/最大/平均温度を、1 時間ごと/毎日/毎週ベースで計算できる必要があります。最小/最大/平均の計算はサーバーで実行できますか?それとも、計算を実行するために各ドキュメントをクライアントにダウンロードする必要がありますか?
アンドリュー
集計を計算するか、サーバー上の DB/ に保存します。これが重要な場合は、元のデータも保持してください。
要約を早期に計算し、それをクライアント/人間レベルに送信することは、通常は誰も掘り下げたくない約 10,000 のサンプルを追跡するよりもはるかに効率的です。
平均、最小、最大、および標準偏差を含む非常に優れた要約は、ほぼすべての目的に対して統計的に包括的です。
クライアントが本当に望んでいる場合は、大きなデータセット (10,000 サンプル) をダウンロードして表示できます。
サーバー上で計算したいのは間違いありませんが、考慮すべき複数のアプローチがあります。
これらは、サンプルごとに手動で更新する特定のドキュメントに保存できます。これは機能する可能性がありますが、1 つのドキュメントに多くの負荷をかけることになり、同時実行の問題が発生する可能性があります。
Map/Reduce インデックスを記述して合計を計算できます。新しいドキュメントを作成するたびに、RavenDB は新しい合計でインデックスを更新します。合計値を合計数で割って平均を求めることができ、最小関数と最大関数を簡単に使用できます。これらの結果を異なる時間間隔で表示したいので、複数のインデックスが必要になります。
私は実際に、まさにそれを行う小さなデモ プログラムを作成しました。温度の代わりに、シミュレートされた圧力計からの PSI 値を記録しています。しかし、コンセプトは同じです。コメントを注意深く読むと、おそらく理解できるショートカットがいくつかあります。
プロジェクト サイト: Raven Sensors
RavenDB の現在のバージョンが 2.0.2261 のときにこれを書きました。しばらく更新していませんが、それでも機能し、関連性があるはずです。
まだあまり使っていませんが、RavenDB 2.5 ではDynamic Aggregationという機能が追加されました。また、Dynamic Reportingとしてスタジオを通じて公開されます。基本的に、これはクエリ時に集計を行います。関心のある集計を表現する方がはるかに簡単であることに気付くかもしれませんが、map-reduce アプローチよりもかなり遅くなる可能性があります。試してみることをお勧めします。パフォーマンスの違いは、集約されるセット内のアイテムの数に帰着する場合があります。