В моем приложении я должен загрузить волимедаты из набора изображений (изображения MRC) и сохранить данные пикселей в памяти (изображения имеют оттенки серого, поэтому один байт на пиксель).
Моя среда разработки - QT framework, 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 ГБ). И текущая структура данных не сможет обработать эти огромные данные.
Как избежать фрагментации? Теперь даже при данных 1000x1000x200 сбой приложения дает bad_alloc.
Каков наилучший способ изменить структуру данных для этого? Должен ли я использовать что-то вроде связного списка, каждый блок имеет размер 100 МБ.
Кроме того, пользователь должен иметь возможность выполнять некоторые фильтры обработки изображений на объемных данных, а также должен иметь возможность сбрасывать значение исходного пикселя.
Это значит, что я должен хранить две копии тома.
С текущей реализацией это как.
unsigned char * volumeDataOriginal;
unsigned char * volumeDataCurrent;
Таким образом, с диапазоном данных 2000x2000x1000 будет использоваться около 8 ГБ (4 ГБ для каждого тома).
Но в Win32 адресное пространство составляет 4 ГБ. Как с этим справиться? Я должен идти с 64-битным приложением?
РЕДАКТИРОВАТЬ:
Вот снимок моего приложения
По сути, я загружаю данные объема (из набора изображений, из формата MRC и т. Д.) И отображаю их в разных средствах просмотра плоскостей (XY, YX, YZ. Изображение показывает средство просмотра плоскостей XY). Мне нужно сохранить более 3 методов доступа к данным для отображения изображения в конкретной плоскости. Используя ползунок, пользователь может выбрать, какое изображение отображать в выбранной плоскости)
Заранее спасибо.