Работа с большим количеством структур в MATLAB

Мне нужно обрабатывать массивные (десятки миллионов) структуры MATLAB; Мне понадобилась дюжина или около того полей, поэтому я полагал, что память не будет проблемой, пока я не обнаружу это (объяснение)

>> s=[];
>> s.first=1;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               132  struct              

>> s.second=2;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               264  struct              

>> s.third=3;
>> whos
  Name      Size            Bytes  Class     Attributes

  s         1x1               396  struct

Что, очевидно, мешает мне использовать десятки миллионов гораздо более крупных структур.

Использование классов решает проблему использования памяти (разметка в 56 байт на массив структур), но непозволительно медленнее при построении и уничтожении объектов.

Как я могу создать структуру, которая будет легкой (например, структуры C) и быстрой?


person Dani    schedule 13.11.2008    source источник
comment
Почему вас это явно останавливает? Вам потребуется 10 ^ 6 * 12 * 132 байта, что может быть или не быть возможным, в зависимости от имеющегося у вас оборудования.   -  person Frank Meulenaar    schedule 07.08.2013


Ответы (4)


Преобразуйте эти структуры в массивы, а затем предоставьте методы доступа через класс.

person Pyrolistical    schedule 13.11.2008

(a) использовать большие массивы (где «первое» поле структуры 1 является элементом 1 «первого» массива, для структуры 2 оно находится в элементе 2 и т. д.), как предлагает Pyrolistical.

(б) рассмотрите возможность использования другого языка, такого как C++ (или, возможно, Java), который обеспечивает лучший контроль над использованием памяти. Вы можете получить доступ к коду C++ через mex-функции (что иногда может быть немного сложно). Вы можете оценить байт-код Java непосредственно из Matlab.

person Mr Fooz    schedule 17.11.2008

Другой вариант: хранить структуру массивов в скрытой глобальной структуре. Создайте объект класса, который копается в этой глобальной структуре, чтобы вырезать данные, которые относятся только к этому одному экземпляру.

Глобальная структура может быть реализована более аккуратно с помощью ключевого слова PERSISTENT и/или использования каталогов private/ для сокрытия информации. Если вы используете 2008a или более позднюю версию, новая система объектов дескриптора должна помочь сделать реализацию намного чище.

Если у вас действительно большие и сложные структуры данных, я бы серьезно подумал о другом языке, таком как C++, Java или Python с numpy. Я люблю Matlab, когда мои задачи хорошо совпадают с ним. Структуры данных не являются сильной стороной Matlab, особенно до 2008a.

person Mr Fooz    schedule 27.11.2008

Что вы имеете в виду под классами? Насколько я помню, классы были термином в Matlab для типа. Я думаю, вы имеете в виду самоопределяемый класс.

Решение (которое также рекомендуется в документах Matlab) состоит в том, чтобы переключиться с массива структур на структуру массивов (посмотрите в своей ссылке пример R, G, B).

person flolo    schedule 13.11.2008
comment
Под использованием классов я имел в виду замену моей структуры классом с теми же свойствами. Структура массивов действительно будет легче, но не даст мне функциональности для ссылки на i-й элемент массива структур, который я часто использую. - person Dani; 13.11.2008