Медленная загрузка сохраненных объектов с диска в Matlab - PullRequest
1 голос
/ 02 июля 2010

Я создал монстра или, по крайней мере, много классов обработки MATLAB, которые указывают друг на друга. Например, эксперимент (дескриптор) - это набор дорожек (дескрипторов), которые содержат прогоны (дескриптор) и переориентации (дескриптор). Затем треки указывают пакет на эксперимент, который их содержит, прогоны и переориентации указывают обратно на трек, с которого они вышли, и они также указывают вперед и назад на следующий прогон и переориентацию.

Я пришел к выводу, что все эти перекрестные наведения могут запутать MATLAB, когда придет время загружать или сохранять файлы, так что, насколько я могу, я определил дескрипторы как Transient и использовал методы set.property для определения задние указатели. Например

Track < Handle
   properties(Transient = true)
      expt;
   end
end

Experiment
   properties(AbortSet = true)
      track;
   end
   methods 
      function set.track(obj, value)
          if (~isempty(value) && isa(value, 'Track'))
              value.expt = obj;
          end
          obj.track = value;
   end
end

Кажется, это несколько ускорило загрузку с диска, но я думаю, что мне все еще не хватает.

Я могу сохранить эксперимент на диск, создав файл размером 48 МБ примерно за 7 секунд. Но затем загрузка файла с диска занимает 3 минуты. Я попытался использовать профилировщик, чтобы найти медленные точки, но он сообщает общее время ~ 50 миллисекунд.

Вопросы:

Кто-нибудь имеет опыт сохранения объектов-дескрипторов на диск и может порекомендовать общие методы для ускорения загрузки?

Есть ли способ заставить профилировщик сообщать о том, что делает matlab с другими 179,95 секундами, или систематический способ определить, что замедляет загрузку без использования профилировщика?

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

Я не работал с объектами-дескрипторами, но, как правило, при сохранении и загрузке возникают накладные расходы для каждого mxarray, поэтому оптимизация файлов MAT - это вопрос преобразования данных в них в форму с меньшим количеством mxarrays. Mxarray - это одноуровневая структура массива. Например:

strs = {'foo', 'bar', 'baz'};

Массив strs содержит 4 mxarrays: один массив ячеек и 3 массива символов.

Чтобы ускорить сохранение и загрузку, попробуйте сделать это при сохранении, и наоборот при загрузке. - конвертировать cellstr в двумерный символ - Преобразование записей организованных структур и объектов в планарно организованные - Устраните избыточные объекты, храня канонический набор значений в одном массиве и заменяя экземпляры объекта индексами в этом массиве. (Это, вероятно, не относится к дескрипторам, которые по своей природе ведут себя так.)

«Организованный по записи» означает, что массив из N вещей представлен в виде N-длинного массива структур со скалярными полями; «планарно организованный» означает, что он представлен в виде скалярной структуры, содержащей в своих полях N-длинные массивы.

Посмотрите, можете ли вы преобразовать свой граф объектов в памяти в нормализованную форму, которая помещается в несколько больших примитивных массивов, подобно тому, как вы можете хранить его в SQL. Свойства объекта для всех объектов в одном наборе массивов и отношения дескрипторов в виде кортежей (id, id), содержащихся в числовых массивах, возможно, с использованием индексов в массивах свойств в качестве идентификаторов вашего объекта.

Saveobj и loadobj, определенные в «верхнем» классе в вашем графе объектов, могут выполнить преобразование.

Также, если вы используете сетевые файловые системы, попробуйте сохранить и загрузить локальную файловую систему с временными копиями. Для чтения скопируйте файл MAT в tempdir и затем оттуда загрузите (); для записи сохраните () в tempdir, а затем скопируйте его на сетевой диск. По моему опыту, save () и load () значительно быстрее с локальным вводом / выводом, этого достаточно, чтобы получить большой чистый выигрыш (ускорение в 2x-3x) даже со временем, чтобы делать копии. Используйте tempname () для выбора временных файлов.

Используя профилировщик, вы используете опцию "-timer real"? По умолчанию «профиль» показывает время процессора, а это вещи, ориентированные на ввод / вывод. С «-timer real» вы должны увидеть те 180 секунд времени, которые были приписаны save () и load (). К сожалению, поскольку они встроенные, профилировщик не позволит вам увидеть их, и это может не сильно помочь.

2 голосов
/ 02 июля 2010

Я не сохраняю объекты дескриптора на диск. Вместо этого у меня есть пользовательские методы сохранения / загрузки, которые копируют информацию из объектов-дескрипторов в структуры для сохранения, из которых я создаю объекты и их зависимости от загрузки.

Таким образом, загрузка выполняется достаточно быстро, и у меня может быть метод исправления, который позволяет мне обновить структуру (или некоторые содержащиеся в ней данные) перед отправкой ее конструктору класса.

Для проблемы с профилировщиком: я думаю, что MATLAB где-то показывает это время как «overhead». Это очень трудно отследить в моем опыте.

0 голосов
/ 02 июля 2010

Вы пробовали разные варианты SAVE, например -v7.3? Я считаю, что при использовании этого формата есть некоторые различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...