HDF5: хранение данных NumPy


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

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

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

Является ли numpy HDF5 бинарная совместимость с C структуры?

UPD:

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

3 2

3 ответа:

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

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

Если выходные наборы данных не разбиты на блоки, они будут записываться последовательно. Пока вы не задаете никакого порядка байтов преобразование в ваших определениях типов данных (т. е. вы указываете, что данные должны быть записаны в собственном формате float/double/integer), вы должны быть в состоянии достичь "бинарной совместимости", Как вы выразились.

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

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

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

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

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

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

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