Загрузка огромного массива ячеек, содержащих структуры
У меня проблема с сохранением и загрузкой огромного набора данных в Matlab.
Мой набор данных содержит свойства серии изображений с использованием Matlab's regionprops
, В настоящее время у меня есть MAT-файл размером около 21 ГБ, и это требует времени для загрузки.
Этот MAT-файл имеет один массив ячеек, содержащий структурные массивы свойств эллипсов на каждом срезе.
Есть ли у них какие-либо предложения относительно того, как обойти это? Есть ли лучший и эффективный способ сохранения MAT-файлов, чем форматы -v7.3?
1 ответ
Одним из решений может быть использование '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.
Если каждое изображение гарантированно содержит одинаковое количество объектов, вы можете рассмотреть возможность размещения этих матриц в одном трехмерном массиве вместо массива ячеек. Усиление здесь будет меньше.