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