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