2010-11-09 2 views
2

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

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

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

Нужна ли HDF5 бинарно совместимо с структурами C тоже?

UPD:

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

+0

Вы говорите, что вы уже реализовали код на C++ для чтения из hdf5-файлов и обнаружили, что он намного медленнее, чем чтение из .npy-файлов? Кроме того, я уверен, что Matlab может читать необработанные двоичные файлы, поэтому, если это единственная причина для использования hdf5, возможно, вам стоит более внимательно изучить чтение файла .npy в matlab. – DaveP

+0

Нет, я читаю * .npy из C++ как двоичные данные и хочу сделать этот трюк с hdf5. Чтение * .npy из MATLAB кажется очень проблематичным –

+0

HDF5 по умолчанию не имеет сжатия. – Yossarian

ответ

1

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

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

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

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

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

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

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

+0

Прокладка не будет проблемой, я ее исправлю. Спасибо за ваш ответ –

+0

Не могли бы вы обмен парсером? –

+0

Никто не должен нуждаться в доступе к данным, подобным этому. Это слишком рискованно, и если вы действительно не делаете этого, чтобы повысить скорость при соблюдении принципов производительности в HDF5. Не только это, но что, если кто-то не использовал родные типы или имел больше дополнений/переменных в наборе данных? Кто знает, какие клиентские платформы выплюнут. Это хрупкий и опасный совет, который поражает значительную часть того, почему HDF5 был сделан. –

9

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

+0

См. Мое обновление, я добавил некоторые подробности. Можете ли вы написать больше о прямом чтении необработанных данных из hdf5 (и как отключить сжатие и другие параметры хранения в hdf5) –

0

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

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

Смежные вопросы