Загрузка огромного массива ячеек, содержащих структуры - PullRequest
0 голосов
/ 14 ноября 2018

У меня проблема с сохранением и загрузкой огромного набора данных в Matlab.

Мой набор данных содержит свойства серий изображений с использованием Matlab's regionprops.В настоящее время у меня есть MAT-файл размером около 21 ГБ, и для его загрузки требуется некоторое время.
Этот MAT-файл имеет один массив ячеек, содержащий структурные массивы свойств эллипсов на каждом срезе.

Являются ли они любымипредложения о том, как обойти это?Есть ли лучший и эффективный способ сохранения MAT-файлов, чем форматы -v7.3?

1 Ответ

0 голосов
/ 14 ноября 2018

Одним из решений может быть использование аргумента 'table' для regionprops. Это приводит к тому, что вывод будет table, а не структурный массив. Этот формат более эффективен для хранения, чем массив struct.

Еще лучше, если вы не возражаете вручную отследить, где какие данные, - создать числовой массив с соответствующими данными:

BW = imread('text.png'); % Example image used in the docs
s = regionprops(BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
t = regionprops('table',BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
m = [s.MajorAxisLength; s.MinorAxisLength; s.Orientation];

whos

  Name        Size             Bytes  Class      Attributes

  BW        256x256            65536  logical              
  m           3x88              2112  double               
  s          88x1              31872  struct               
  t          88x3               3496  table                

Числовой массив - гораздо более эффективный способ хранения данных, чем структурный массив, поскольку каждый элемент в структурном массиве представляет собой отдельную матрицу, которой требуется собственный заголовок. Заголовок (я полагаю, 114 байтов) в этом случае намного больше, чем значение, хранящееся в массиве (в данном случае 8 байтов), следовательно, издержки 31872 / 2112 = 15.1.

Таблица хранит каждый столбец в отдельном массиве, поэтому у вас намного меньше накладных расходов. Вместо массивов 3 x 88 (количество объектов x количество объектов) у вас есть только 3.

Если гарантировано, что каждое изображение имеет одинаковое количество объектов, вы можете рассмотреть возможность размещения этих матриц в одном трехмерном массиве вместо массива ячеек. Усиление здесь будет меньше.

...