線グラフを作成しているのですが、
Nodeとなるデータが50万件あり、メモリを圧迫してしまいます。
1Node=int(4Byte) × 50 = 2GByte弱
データは CArray<int> として管理しています。
全てのデータをメモリに展開しているのがいけないのは分かるんですが、
メモリから破棄してしまうと、再描画時に時間がかかってしまいます。
何か良い方法はあるのでしょうか?
追記
環境は
WinXP以降
.NET2008 VC++
MFC
です。
以上、よろしくお願いします。
追記2
グラフのデータはテキストファイルから読込しています。
普通に考えればよいのではないでしょうか。
1.人は一度に数千を超えるデータを認識することはできない。
2.画面上にはせいぜい数千点しか描画できない(現実的には2千程度)。
なぜならディスプレイの解像度がそんなもん(笑)。
以上のことから、画面上にはせいぜい数千程度を描画すれば良い事が
わかります。このことから、表示用データは、元データから、必要な
部分をおろぬけば良い事がわかります。代表させる点は、対象範囲に
対して、単純選抜、平均値による代表、min/maxによる代表などの方法が
考えられます。
次にファイルから読み込むと遅いとのことですが、テキストから
読ませたのでは当然の結果と言えます。
バイナリデータに変換してからそれを表示対象データとするのが
一般的です。現在のOSのファイルに対するキャッシュは非常に
優秀なので、メモリーに全てをキャッシュするのは、二重に
キャッシュするのと同じで、ややばかげています。
スクロール範囲を考慮して、メモリー上の描画用リングバッファには
せいぜい数万程度の点をキャッシュするのが一般的です。
当然ですがこのキャッシュ点は、画面のX軸の拡大率から算定される
代表点(おろぬきした点)です。
4byte×50万件ならたかだか2MBにしかならないと思うけど・・・?
私も現在10万点の散布図を描画しています。
グラフは、点データが設定された時点でメモリ上の
ビットマップに描画しておき、
再描画時(WM_PAINT)ではそのビットマップを
スクリーンにコピーしています。
以上、参考までに。
ツイート | ![]() |