Альтернативы Matlab Mat File Format

Я нахожу, что запись и чтение собственного формата файла мата становится очень медленным с большими структурами данных размером около 1 ГБ. Кроме того, у нас есть другое, не-matlab, программное обеспечение, которое должно быть в состоянии читать и писать эти файлы. Поэтому я хотел бы найти альтернативный формат для сериализации структур данных Matlab. В идеале этот формат...

  • может представлять произвольную структуру Matlab в файл.
  • имеют более быстрый ввод-вывод, чем файлы матов.
  • имеют библиотеки ввода-вывода для других языков, таких как Java, Python и С++.

Ответ 1

Упрощение структур данных и использование нового формата файлов MAT файлов v7.3, который является вариантом HDF5, на самом деле может быть лучшим подходом. Формат HDF5 открыт и уже имеет библиотеки ввода-вывода для других языков. И в зависимости от вашей структуры данных они могут быть быстрее, чем старые файлы двоичных матчей.

  • Упростите структуры данных, которые вы сохраняете, предпочитая массивы примитивов сложным структурам контейнеров.
  • Попробуйте отключить сжатие, если ваши структуры данных все еще сложны.
  • Попробуйте формат файла MAT v7.3 с помощью "-v7.3"
  • Если вы используете сетевую файловую систему, подумайте о сохранении и загрузке во временный каталог на быстром локальном диске и копировании в/из сети.

Для больших структур данных скорость ввода-вывода вашего MAT файла может быть определена большей внутренней структурой данных, которые вы записываете, чем размер результирующего файла MAT. (По моему опыту, это обычно было основным фактором медленных файлов MAT.) Когда вы говорите "произвольная структура Matlab", это предполагает, что вы можете использовать ячейки, структуры или объекты для создания сложных структур данных. Это замедляет ввод/вывод MAT, поскольку в MAT файле вводятся операции ввода-вывода, а элементы массивов ячеек и структур (типы контейнеров) считаются отдельными массивами. Например, 5000 строк, хранящихся в cellstr, намного медленнее, чем те же 5000 строк, хранящихся в массиве 2-D char. И объекты имеют еще больше накладных расходов. В качестве теста попробуйте записать файл размером 1 ГБ, содержащий только 1-битный примитивный массив случайных uint8, и посмотрите, сколько времени потребуется. Оттуда, посмотрите, можете ли вы упростить свои данные, чтобы уменьшить общий счет mxarray, даже если это означает его изменение для сериализации. (Мой опыт с этим в основном связан с форматом v7, но новый формат HDF5 может иметь меньше накладных расходов на каждый элемент.)

Если ваши файлы данных живут в сети, вы также можете попробовать выполнять операции сохранения и загрузки во временных файлах на быстрых локальных дисках и отдельно использовать операции копирования для перемещения их между сетью. По крайней мере, в сетях Windows, я видел ускорение до 2x от этого. Возможно, из-за оптимизации операция копирования полного файла может сделать, что код ввода/вывода MAT не может.

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

Ответ 2

Формат

mat изменился с версиями Matlab. v7.3 использует формат HDF5, который имеет встроенное сжатие и другие функции, и может потребоваться много времени для чтения/записи. Однако вы можете заставить Matlab использовать предыдущие форматы, которые быстрее (но могут занимать больше места).

Смотрите здесь:

http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html