私のアプリケーションでは、一連の画像 (MRC 画像) からボリュームデータを読み込み、ピクセル データをメモリに保持する必要があります (画像はグレースケールなので、1 ピクセルあたり 1 バイト)。
私の開発環境は QT フレームワーク、Windows では MinGW、Linux では GCC です。
現時点では、単純なデータ構造を使用してボリュームデータを次のように保存します。
unsigned char *volumeData;
そして、次のように 1 つの巨大な割り当てを行います。
volumeData=new unsigned char[imageXsize * imageYsize * numofImages];
以下は、次のような特定の平面の画像データにアクセスするための重要な方法です。
unsigned char* getXYPlaneSlice(int z_value);
unsigned char* getYZPlaneSlice(int x_value);
unsigned char* getZXPlaneSlice(int y_value);
私の単純なデータ構造では、上記のメソッドを簡単に実装できました。
しかし、将来的には 2000x2000x1000 (~3.7Gb) のボリューム サイズを採用する必要があるかもしれません。現在のデータ構造では、その巨大なデータを処理することはできません。
断片化を避けるには? 現在、1000x1000x200 のデータでも、アプリケーションがクラッシュして bad_alloc が発生します。これのデータ構造を変更する最良の方法は何ですか? 各チャンクのサイズが 100 MB のリンク リストのようなものを使用しますか。
また、ユーザーはボリュームデータに対していくつかの画像処理フィルターを実行できる必要があり、元のピクセル値にリセットできる必要があります。つまり、ボリューム データのコピーを 2 つ保持する必要があります。現在の実装では、そのようなものです。
unsigned char *volumeDataOriginal;
unsigned char *volumeDataCurrent;
したがって、2000x2000x1000 のデータ範囲では、約 8Gb (各ボリュームで 4Gb) を使用します。しかし、Win32 ではアドレス空間が 4GB あります。64ビットアプリケーションを使用する必要がありますか?
編集:これは私のアプリケーションのスナップショットです
基本的に、ボリューム データを (一連の画像から、MRC 形式などから) 読み込み、それらをさまざまな平面ビューアー (XY、YX、YZ。画像は XY 平面ビューアーを示しています) で表示します。上記を維持する必要があります。特定の平面に画像を表示するための 3 つのデータ アクセス方法。ユーザーはスライダー バーを使用して、選択した平面に表示する画像を変更できます)
前もって感謝します。