グラフのデータ管理について


桜井  2011-11-09 17:50:28  No: 72996

線グラフを作成しているのですが、
Nodeとなるデータが50万件あり、メモリを圧迫してしまいます。
1Node=int(4Byte) × 50 = 2GByte弱
データは CArray<int> として管理しています。

全てのデータをメモリに展開しているのがいけないのは分かるんですが、
メモリから破棄してしまうと、再描画時に時間がかかってしまいます。
何か良い方法はあるのでしょうか?


桜井  2011-11-09 17:52:05  No: 72997

追記

環境は
WinXP以降
.NET2008 VC++
MFC

です。

以上、よろしくお願いします。


桜井  2011-11-09 18:35:19  No: 72998

追記2

グラフのデータはテキストファイルから読込しています。


仲澤@失業者  2011-11-09 19:55:35  No: 72999

普通に考えればよいのではないでしょうか。
  1.人は一度に数千を超えるデータを認識することはできない。
  2.画面上にはせいぜい数千点しか描画できない(現実的には2千程度)。
    なぜならディスプレイの解像度がそんなもん(笑)。
以上のことから、画面上にはせいぜい数千程度を描画すれば良い事が
わかります。このことから、表示用データは、元データから、必要な
部分をおろぬけば良い事がわかります。代表させる点は、対象範囲に
対して、単純選抜、平均値による代表、min/maxによる代表などの方法が
考えられます。

次にファイルから読み込むと遅いとのことですが、テキストから
読ませたのでは当然の結果と言えます。
バイナリデータに変換してからそれを表示対象データとするのが
一般的です。現在のOSのファイルに対するキャッシュは非常に
優秀なので、メモリーに全てをキャッシュするのは、二重に
キャッシュするのと同じで、ややばかげています。
スクロール範囲を考慮して、メモリー上の描画用リングバッファには
せいぜい数万程度の点をキャッシュするのが一般的です。
当然ですがこのキャッシュ点は、画面のX軸の拡大率から算定される
代表点(おろぬきした点)です。


pie  2011-11-09 21:56:32  No: 73000

4byte×50万件ならたかだか2MBにしかならないと思うけど・・・?


ひろ  2011-11-10 00:22:04  No: 73001

私も現在10万点の散布図を描画しています。

グラフは、点データが設定された時点でメモリ上の
ビットマップに描画しておき、
再描画時(WM_PAINT)ではそのビットマップを
スクリーンにコピーしています。

以上、参考までに。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加