Эффективный доступ к диску большого количества небольших файлов .mat, содержащих объекты - PullRequest
4 голосов
/ 16 августа 2011

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

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

То, что я пробовал:

Способ 1. Если я сохраняю каждый файл по отдельности, у меня возникают проблемы с производительностью (очень медленное время сохранения и некоторое замедление работы системы в течение некоторого времени после этого), поскольку Windows 7 испытывает трудноститак же, как и файлы в папке (и я думаю, что мой SSD тоже переживает не лучшие времена).Тем не менее, конечный результат в порядке, я могу загрузить то, что мне нужно очень быстро.Это использует '-v6' save.

Метод 2: Если я сохраняю все файлы в одном файле .mat, а затем загружаю только нужные мне переменные, доступ идет очень медленно (загрузка занимает около трех четвертейвремя, необходимое для загрузки всего файла, с небольшими изменениями в зависимости от порядка сохранения).При этом также используется сохранение '-v6'.

Я знаю, что могу разбить файлы на несколько папок, но это выглядит как неприятный хак (и это не исправит неприязнь SSD к записи большого количества маленьких файлов).), Есть ли способ лучше?

Редактировать: Объекты состоят в основном из числовой матрицы двойных данных и сопровождающего вектора идентификаторов uint32, а также набора небольших идентифицирующих свойств (char и numeric).

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Пять идей для рассмотрения:

  1. Попробуйте сохранить объект HDF5 - взгляните на http://www.mathworks.com/help/techdoc/ref/hdf5.html - вы можете обнаружить, что это решает все ваши проблемы.Он также будет совместим со многими другими системами (например, Python, Java, R).
  2. Вариант вашего метода № 2 - хранить их в одном или нескольких файлах, но отключать сжатие.
  3. Различные типы данных. Возможно также, что у вас есть объекты, которые необъяснимо плохо сжимаются или распаковываются.У меня были такие проблемы с массивами ячеек или структурными массивами.В конце концов я нашел способ обойти это, но это было давно, и я не могу вспомнить, как воспроизвести эту конкретную проблему.Решением было использование другой структуры данных.
  4. @ SB предложил базу данных.Если ничего не помогает, попробуйте это.Мне не нравится создавать внешние зависимости и дополнительные интерфейсы, но это должно работать (основная проблема заключается в том, что если БД начнет стонать или портить ваши данные, то вы вернетесь на квадрат 1).Для этого рассмотрим SQLite, для которого не требуется отдельная среда сервер / клиент.В Matlab Central доступен интерфейс: http://www.mathworks.com/matlabcentral/linkexchange/links/1549-matlab-sqlite
  5. (новый). Учитывая, что объекты имеют размер менее 1 ГБ, может быть проще просто скопировать весь набор на диск ОЗУ и затем получить доступ через него.Просто не забудьте скопировать с RAM-диска, если что-то сохранено (или обернуть save, чтобы сохранить объекты в двух местах).

Обновление: OP упоминал пользовательские объекты.Существует два метода для их сериализации:

  1. Две программы сериализации от Matlab Central: http://www.mathworks.com/matlabcentral/fileexchange/29457 - которые были вдохновлены: http://www.mathworks.com/matlabcentral/fileexchange/12063-serialize
  2. Буферы протокола Google,Взгляните сюда: http://code.google.com/p/protobuf-matlab/
1 голос
/ 16 августа 2011

Попробуйте сохранить их в виде больших двоичных объектов в базе данных.

Я бы также попробовал метод с несколькими папками - он мог бы работать лучше, чем вы думаете.Это также может помочь с организацией файлов, если это то, что вам нужно.

0 голосов
/ 16 августа 2011

Решение, которое я нашел, состоит в том, чтобы сохранить массивы объектов примерно по 100 объектов в каждом.Эти файлы, как правило, имеют размер 5-6 мегабайт, поэтому загрузка не является запретительной, а доступ - это просто вопрос загрузки нужного массива (-ов) и последующего помещения их в нужную запись (-и).Этот компромисс позволяет избежать записи слишком большого количества маленьких файлов, по-прежнему обеспечивает быстрый доступ к отдельным объектам и позволяет избежать дополнительных затрат на базу данных или сериализацию.

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