Структура данных для хранения огромного количества данных?

В моем приложении мне нужно загрузить объемные данные из набора изображений (изображения MRC) и сохранить данные пикселей в памяти (изображения имеют оттенки серого, поэтому один байт на пиксель).

Моя среда разработки - это среда разработки QT, MinGW для Windows и GCC для Linux.

На данный момент я использую простую структуру данных для хранения объемных данных как:

unsigned char *volumeData;

и делаю одно огромное распределение следующим образом.

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,7 ГБ). И текущая структура данных не сможет обрабатывать эти огромные данные.

  1. Как избежать фрагментации? Теперь, даже с данными 1000x1000x200, сбой приложения дает bad_alloc. Как лучше всего изменить структуру данных для этого? должен ли я использовать что-то вроде связанного списка, каждый блок которого имеет размер 100 МБ.

  2. Кроме того, пользователь должен иметь возможность выполнять некоторые фильтры обработки изображений для данных объема, а также должен иметь возможность сбросить до исходного значения пикселя. Это означает, что я должен хранить две копии данных тома. При текущей реализации это похоже на:

    unsigned char * volumeDataOriginal;

    unsigned char * volumeDataCurrent;

Таким образом, с диапазоном данных 2000x2000x1000 он будет использовать около 8 ГБ (4 ГБ для каждого тома). Но в Win32 адресное пространство составляет 4 ГБ. Как с этим бороться? Я должен использовать 64-битное приложение?

РЕДАКТИРОВАТЬ: Вот снимок моего приложения enter image description here

По сути, я загружаю объемные данные (из набора изображений, из формата MRC и т. Д.) И отображаю их в разных плоскостях просмотра (XY, YX, YZ.Image показывает XY- plane-viewer). Мне нужно сохранить более 3 методов доступа к данным, чтобы показывать изображение в определенной плоскости. С помощью ползунка пользователь может изменить, какое изображение показывать в выбранной плоскости)

Заранее благодарим.

12
задан Guru 18 April 2013 в 05:19
поделиться