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


桜井  2011-11-09 08:50:28  No: 72996  IP: [192.*.*.*]

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

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

編集 削除
桜井  2011-11-09 08:52:05  No: 72997  IP: [192.*.*.*]

追記

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

です。

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

編集 削除
桜井  2011-11-09 09:35:19  No: 72998  IP: [192.*.*.*]

追記2

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

編集 削除
仲澤@失業者  2011-11-09 10:55:35  No: 72999  IP: [192.*.*.*]

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

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

編集 削除
pie  2011-11-09 12:56:32  No: 73000  IP: [192.*.*.*]

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

編集 削除
ひろ  2011-11-09 15:22:04  No: 73001  IP: [192.*.*.*]

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

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

以上、参考までに。

編集 削除