Структура данных для хранения огромного количества данных? - PullRequest
12 голосов
/ 09 ноября 2010

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

  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. Изображение показывает средство просмотра плоскостей XY). Мне нужно сохранить более 3 методов доступа к данным для отображения изображения в конкретной плоскости. Используя ползунок, пользователь может выбрать, какое изображение отображать в выбранной плоскости)

Заранее спасибо.

Ответы [ 11 ]

0 голосов
/ 16 ноября 2010

Взгляните на SciDB . Я не эксперт в этом, но из его примеров использования и бумаги, описывающей это , это позволяет вам естественно отобразить ваши данные в 3D (+ 1D для времени / контроля версий) массив такой:

CREATE ARRAY Pixels [
    x INT,
    y INT,
    z INT,
    version INT
] (
    pixel INT
);

И для реализации вашего запроса getXYPlaneSlice:

Slice (Pixels, z = 3, version = 1);

Чтобы избежать дублирования данных при изменении только части данных, вам не нужно заполнять весь массив для версии 1, так как SciDB поддерживает разреженный массив. Затем, когда вам нужно загрузить новейшие данные, вы можете загрузить с помощью version = 0, чтобы получить старую версию, и обновить результат другой загрузкой с помощью version = 1.

...