私は、温度、電流または電圧のような大量の時間ベースのデータを生成するいくつかの産業用デバイスのためのビジュアライゼーションを構築しています。すべてのデータは常にSQL Serverデータベースに書き込まれます(その部分を制御することはできません)。大量のセンサーデータをスムーズにする/減らす/フィルターをかける方法は?
HTML5フロントエンドは、d3.jsで作成したインタラクティブなズーム可能なチャートで構成されています。要求に応じてデータ系列をチャートに追加(ロード)することができます。フロントエンドはajaxリクエストを送信し、ASP.NET MVCとEF6はDBから値をフェッチしてJsonとして返します。
各データ要素は、単純にDateTimeと値で構成されています。値はでなく、で一定間隔(2秒ごとなど)で書かれますが、不規則な間隔で書き込まれます。これは、デバイスが定期的にポーリングされるのではなく、例えば0.1℃の変化によって温度が上昇/下降するような特定のイベントでデータを送信するためです。
これまでのところすべてがうまく機能し、スムーズですが、大量のデータが問題になります。たとえば、3ヶ月という選択期間の折れ線グラフを表示する場合、各データ系列はすでにapprで構成されています。 500.000の値であるため、サーバーからのJsonの応答も大きくなり、要求は時間の経過と共に長くなります。
私は温度曲線のピークなどの関連情報を失うことなくデータの量を減らす方法を探していますが、同時に信号のノイズを滑らかにしたいのです。ここで
は一例ですが、通常はユーザーが同様であっても、数ヶ月または数年のデータを見たい、これはいくつかの時間または数日のちょうど選ばれた期間であることに注意してください。
グリーン線は温度であり、赤色の棒はデジタル状態(この場合、温度曲線の1つを上昇させるヒーター)の表現である。
信号にノイズがはっきりと現れることがありますが、これは私が取り除きたいものです。同時に、ヒーターがオンになり、温度が急激に上昇したり下がったりするような特性を維持したい。
生データを所定の長さのブロックにチョッピングしてからデータを集約して、その間隔の最小値、最大値、平均値を得ました。これは機能しますが、カーブの特性が失われ、すべてが平らになったり平均化されたりします。
上部一連の緑の線、各チョップの範囲(最小/最大)として示されているの平均:ビットをズームアウトし、上記のように凝集キックようにここで同じ期間の画像は、です平均線の周りの緑色の領域で表されます。
DBから出てきたデータをフロントエンドに送る前にデータをフィルタリング/スムーズ/リダクションするために使用できる、何らかの種類のアルゴリズムがありますか?ここで私は掘り起こす必要がある流行語は何ですか?特定のライブラリ、フレームワーク、または技術は、このトピックに関する一般的なコメントと同様に高く評価されます。私は主にサーバー側のソリューションに興味がありますが、同じ問題に直面している他の人にとっても、クライアント側のJavascriptソリューションだけでなく、関心を寄せていることにも気を付けてください。
あなたが探している流行語はtimeseriesです。それのための銀の弾丸はありません。しかし、ほとんどの場合、ズーミングに応じて値を集計する必要があります。だから分ズームのために取得しているデータの数を減らすことがたくさん集まります... –
あなたはそうです、私はすでにそれを考慮に入れました。集計チョップのサイズは、グラフのサイズと現在表示されている時間の範囲、正確には次のとおりです。グラフは利用可能なグラフの幅に基づいて所定の間隔に分割され、集計の粒度は常に視覚的な外観と一致します。ズームアウト(可視範囲が拡大)するとチャンク間隔が大きくなり、チャンクの数は変わりません。 – Robert
SQL Serverからnosqlへの移行を検討し、集約するためにmap-reduceを使用することをお勧めします。 –