HDF5: хранение данных NumPy - PullRequest
2 голосов
/ 09 ноября 2010

когда я использовал NumPy, я сохранял данные в собственном формате * .npy.Это очень быстро и дало мне некоторые преимущества, например:

  • Я мог читать * .npy из кода C как простые двоичные данные (я имею в виду, что * .npy двоично совместим со структурами C)

Теперь я имею дело с HDF5 (PyTables в данный момент).Как я читал в руководстве, они используют сериализатор NumPy для хранения данных NumPy, поэтому я могу читать эти данные из C как из простых файлов * .npy?

Имеет ли двоичный формат HDF5 совместимость со структурами C??

UPD:

У меня есть клиент Matlab, читающий из hdf5, но я не хочу читать hdf5 из C ++, потому что чтение двоичных данных из * .npy происходит в разы быстрее, поэтому у меня действительно естьнужно читать hdf5 из C ++ (двоичная совместимость). Поэтому я уже использую два способа передачи данных - * .npy (чтение из C ++ как байтов, из Python изначально) и hdf5 (доступ из Matlab). И если это возможно, хотитеиспользовать только один способ - hdf5, но для этого мне нужно найти способ сделать hdf5 бинарно-совместимым со структурами C ++, пожалуйста, помогите, если есть какой-то способ отключить сжатие в hdf5 или что-то еще, чтобы сделать hdf5бинарно-совместимые со структурами C ++ - скажите, где я могу прочитать об этом ...

Ответы [ 3 ]

9 голосов
/ 09 ноября 2010

Правильный способ чтения hdf5-файлов из C - это использовать hdf5 API - см. учебник . В принципе можно напрямую считывать необработанные данные из файла hdf5, как если бы вы использовали файл .npy, при условии, что вы не использовали дополнительные параметры хранения, такие как сжатие, в своем файле hdf5. Тем не менее, это по существу не подкрепляет весь смысл использования формата hdf5, и я не могу думать о каком-либо преимуществе делать это вместо использования надлежащего hdf5 API. Также обратите внимание, что API имеет упрощенную высокоуровневую версию , которая должна сделать чтение из C относительно безболезненным.

1 голос
/ 10 ноября 2010

Я чувствую твою боль. Я имел дело с огромным количеством данных, хранящихся в файлах в формате HDF5, и собрал несколько битов информации, которые могут оказаться полезными.

Если вы «контролируете» создание файлов (и запись данных - даже если вы используете API), вы сможете полностью обойти библиотеки HDF5.

Если выходные наборы данных не разделены на части, они будут записаны непрерывно. Пока вы не определяете какое-либо преобразование порядка байтов в своих определениях типов данных (т.е. вы указываете, что данные должны быть записаны в собственном формате с плавающей запятой / двойным / целым числом), вы должны быть в состоянии достичь «двоичной совместимости», как вы указали это.

Чтобы решить мою проблему, я написал анализатор файлов HDF5, используя спецификацию файла http://www.hdfgroup.org/HDF5/doc/H5.format.html

С помощью довольно простого парсера вы сможете определить смещение (и размер) любого набора данных. На этом этапе просто fseek и fread (в C, то есть, возможно, есть подход более высокого уровня, который вы можете использовать в C ++).

Если ваши наборы данных разбиты на фрагменты, то для анализа b-деревьев, используемых для организации порций, требуется больше разбора.

Единственная другая проблема, о которой вам следует знать, - это обработка (или устранение) любого системно-зависимого заполнения структуры.

0 голосов
/ 03 мая 2015

HDF5 позаботится о бинарной совместимости структур для вас. Вам просто нужно сообщить, из чего состоят ваши структуры (dtype), и у вас не возникнет проблем с сохранением / чтением массивов записей - это потому, что система типов в основном 1: 1 между numpy и HDF5. Если вы используете H5py, я уверен, что ввод-вывод должен быть достаточно быстрым, при условии, что вы используете все нативные типы и большие пакетные операции чтения / записи - весь набор допустимых данных. После этого это зависит от разбиения на фрагменты и от того, какие фильтры (например, перемешивание, сжатие) - стоит также отметить, что иногда они могут ускориться за счет значительного уменьшения размера файла, поэтому всегда обращайте внимание на эталонные тесты. Обратите внимание, что выбор типа и фильтра выполняется в конце создания документа HDF5.

Если вы пытаетесь разобрать HDF5 самостоятельно, вы делаете это неправильно. Используйте C ++ и C apis, если вы работаете в C ++ / C. На веб-сайте групп HDF5 есть примеры так называемых «типов соединений».

...