2

私が取り組んでいる製品には、数百から数百万回の反復を行うことができる反復ループがあります。各反復では一連の統計変数 (倍精度) が計算され、変数の数は最大 1000 (通常は 15 ~ 50) です。

ループの一部として、反復中の変数の変化をグラフ化するため、X 軸は反復、Y 軸は変数 (色でコード化) です。

http://sawtoothsoftware.com/download/temp/walt/graph.jpg

現在、データは以下を含むファイルに格納されています:
変数
の 4 バイト整数、反復の 4 バイト整数、
および値の 8 バイト double。

y 軸の合計スケールは時間の経過とともに変化するため、現在のスケールに合わせてグラフのサイズを変更することが望まれます (これは図で確認できます)。

約 5 秒間隔で、データが読み取られてビットマップにプロットされ、ユーザーに表示されます。全体の再描画を避けるためにいくつかの最適化を試みますが、反復回数または変数の数が大きくなると、描画に 5 秒以上かかる巨大なファイルになってしまいます。

可能であれば、この大量のデータをより効果的かつ迅速に処理する方法についてのアイデアを探しています。

4

4 に答える 4

4

SQL 用語では、結果をグループ化して集計する必要があります。画面をスクロールしないと、グラフに 10,000 個のデータ ポイントすべてを表示することはできません。1 つの方法は、タイム スケール (秒、分など) でグループ化し、AVG()MAX()、またはMIN()をクエリして、データ ポイントをより小さいスケールに縮小することです。

MySQL の例、秒単位でグループ化:

select time_collected, AVG(value)
from Table
group by UNIX_TIMESTAMP(time_collected)

また、集計値を組み合わせてローソク足チャートで視覚化することも検討してください。

于 2009-03-06T14:09:07.340 に答える
3

反復ごとにデータを表示することの価値と、ユーザーが本当に気にかけているこのデータについては、自問する必要があります。ここで行う必要がある主なことは、ユーザーに表示するデータの量を減らすことだと思います。

たとえば、ユーザーが傾向のみを気にしている場合は、(すべての反復ではなく)非常に多くの反復ごとにのみこれらの関数を評価することで簡単に回避できます。上のグラフでは、100回の反復ごとに曲線上の値のみを描画することで、おそらく同じように有益なプロットを取得できます。これにより、データセットのサイズ(および描画アルゴリズムの速度)が100分の1に減少します。明らかに、さらに詳細が必要な場合は、これを調整できます。

再描画時にデータポイントを再計算する必要がないようにするには、すべてのデータを再計算または再ロードするのではなく、メモリに既に描画したポイントの小さなセットを保持します。この方法でディスクに移動することを回避でき、これらすべてのポイントを再度レンダリングするために、ほとんど多くの作業を行うことはありません。

サンプリングエラーによる外れ値の欠落などが心配な場合は、元のデータからの単一のサンプルではなく、スライディングウィンドウに基づいてサンプルポイントのセットを計算するのが簡単です。ユーザーに表示するデータの最大、最小、平均、中央値、および場合によっては計算エラーバーを維持することができます。

あなたが本当に積極的になる必要があるなら、人々は時系列データを減らして表示するためのたくさんの素晴らしい方法を考え出しました。詳細については、ウィキペディアの記事を確認するか、これらのメソッドの多くがすでに組み込まれているRなどのツールキットを調べることができます。

最後に、このスタックオーバーフローの質問も関連しているようです。

于 2008-11-04T22:43:06.057 に答える
1

グラフから、数百のピクセルに 10,000 回の反復をプロットしていることがわかります。そのため、グラフには 100 分の 1 の情報ポイントを使用し、残りは無視してください。ユーザーには同じように見えます

于 2009-03-06T14:02:18.513 に答える
0

ビットマップ (または XPM のようなピックスマップ) を生成しないのはなぜですか? 各列 (または行) は反復に対応し、同じ色の高さ (行の幅) は変数値に対応します。XPM 形式は、テキスト (ピクセルに対して 1 文字) であり、クロスプラットフォームであるため、より単純です。

于 2011-06-08T06:00:13.563 に答える