2010-07-01 2 views
1

Я создал монстра или, по крайней мере, много классов дескрипторов MATLAB, которые указывают друг на друга. Например, эксперимент (дескриптор) представляет собой набор треков (ручек), которые содержат прогоны (дескриптор) и переориентации (дескриптор). Затем треки указывают на эксперимент, который содержит их, прогоны и переориентации указывают на отслеживаемый трек, и они также указывают вперед и назад на следующий прогон & переориентации.Загрузка сохраненных объектов с диска происходит медленно в 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 секунд, или систематический способ определить, что замедляет загрузку без использования профилировщика?

+0

Вы забыли приложить код, используемый для сохранения и загрузки данных. Не зная этого кода, невозможно дать вам достойный ответ. –

+0

Я сохраняю файлы, используя стандартные команды сохранения и загрузки matlab для сохранения в .mat-файлах. – Marc

+0

Обрабатываемые объекты обычно имеют ужасную производительность, см. Здесь: http://stackoverflow.com/questions/1446281/matlabs-garbage-collector/1489751#1489751 – Mikhail

ответ

2

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

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

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

+0

Я думаю, что MATLAB поддерживает преобразование в структуру с помощью методов «saveobj» и «loadobj», которые вы можете определить для каждого класса. Проблема, которую я мог видеть, это не то, что я должен писать эти методы для каждого подкласса. – Marc

+0

Вот почему я создал методы сохранения и загрузки в своем суперклассе, которые унаследованы. Если некоторые свойства должны обрабатываться иначе, чем другие, вы можете либо написать свои методы, чтобы они узнали что-то другое в отношении методов, либо у вас есть скрытое свойство в каждом подклассе, в котором перечислены специальные свойства. – Jonas

+0

, но как вы справляетесь с вызовом конструктора в методе loadobj? Например. bar Marc

0

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

+0

Я думаю, что в какой-то момент у меня было значение по умолчанию 7.3, и для сохранения я убил MATLAB, используя диспетчер задач. Нет никакой разницы между двумя другими форматами (сжатыми и несжатыми) в режиме сохранения или загрузки. – Marc

2

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

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

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

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

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

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

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

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

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

+0

спасибо за советы. Я попытался запустить профилировщик с флагом -timer real и получить те же результаты, потому что профилировщик игнорирует встроенные модули верхнего уровня. Поэтому я положил команду load в анонимную функцию и снова запустил ее. Как вы и предполагали, я получаю полезный результат: «Время автономной работы (встроенные, накладные и т. Д.)» Составляет 100% времени загрузки. – Marc