Буферы протокола Google, HDF5, сравнение NumPy (передача данных)

Мне нужна помощь, чтобы принять решение. Мне нужно передать некоторые данные в моем приложении, и мне нужно сделать выбор между этими 3 технологиями. Я немного прочитал обо всех технологиях (руководства, документация), но все еще не могу определиться ...

Как они сравниваются?

Мне нужна поддержка метаданных (возможность получать файл и читать его без какой-либо дополнительной информации / файлов), быстрые операции чтения / записи, возможность хранить динамические данные будет плюсом (как объекты Python)

То, что я уже знаю:

  • NumPy работает довольно быстро, но не может хранить динамические данные (например, объекты Python). (А как насчет метаданных?)
  • HDF5 очень быстрый, поддерживает настраиваемые атрибуты, прост в использовании, но не может хранить объекты Python . Также HDF5 изначально сериализует данные NumPy, поэтому, IMHO, NumPy не имеет преимуществ перед HDF5.
  • Буферы протокола Google тоже поддерживают самоописание, работают довольно быстро (но в настоящее время поддержка Python оставляет желать лучшего. , медленный и глючный). МОЖЕТ хранить динамические данные. Минусы - самоописание не работает с Python, а сообщения размером> = 1 МБ сериализуются / десериализуются не очень быстро (читай «медленно»).

PS: данные, которые мне нужно передать, являются «результатом работы» NumPy / SciPy (массивы, массивы сложных структур и т. Д.)

UPD: требуется межъязыковой доступ (C / C ++ / Python)


person illegal-immigrant    schedule 08.11.2010    source источник
comment
Если вы вообще рассматриваете HDF5, используйте PyTables. pytables.org/moin По сути, он позволяет создавать классы для простого и быстрого хранения, воссоздания и запроса метаданных. и множество массивов в HDF5. Поскольку он просто сохраняет вещи в HDF5, вы сможете легко получить доступ к вещам на C / C ++ через обычные библиотеки.   -  person Joe Kington    schedule 08.11.2010
comment
Да, я знаю о PyTables, они просты в использовании и поддерживают разные языки, но они не позволяют мне хранить объекты Python ...   -  person illegal-immigrant    schedule 08.11.2010


Ответы (2)


Кажется, в вашем вопросе есть небольшое противоречие - вы хотите иметь возможность хранить объекты Python, но вам также нужен доступ C / C ++. Я думаю, что независимо от того, какой выбор вы выберете, вам нужно будет преобразовать свои причудливые структуры данных Python в более статические структуры, такие как массивы.

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

Если вы решите использовать HDF5, я бы также рекомендовал вам использовать h5py вместо pytables. Это связано с тем, что pytables создает файлы HDF5 с большим количеством дополнительных питонических метаданных, что затрудняет чтение данных на C / C ++, тогда как h5py не создает никаких из этих дополнений. Вы можете найти сравнение здесь, и они также дают ссылку на часто задаваемые вопросы по pytables, чтобы узнать о них, чтобы вы могли решить, что лучше всего соответствует вашим потребностям.

Другой формат, очень похожий на HDF5, - это NetCDF. У него также есть привязки Python, однако у меня нет опыта использования этого формата, поэтому я не могу ничего комментировать, кроме как указать, что он существует и также широко используется в научных вычислениях.

person DaveP    schedule 08.11.2010
comment
Спасибо за ваш ответ. Я знаю, что, вероятно, ни один из этих 3 не может полностью удовлетворить мои потребности, поэтому я создал здесь вопрос, выбор действительно немного сложен. P.S Вчера прочтите документацию по буферам Google и обнаружите одну интересную вещь: они не предназначены для передачи больших объемов данных (›1 МБ), поэтому подумайте, что решение касается NumPY и HDF5 .. - person illegal-immigrant; 09.11.2010
comment
Метаданные, которые добавляет PyTables, очень ненавязчивы, всего лишь несколько дополнительных атрибутов для наборов данных. Вы можете отключить его, установив tables.parameters.PYTABLES_SYS_ATTRS = False или открыв файл с указанным аргументом PYTABLES_SYS_ATTRS=False. - person AFoglia; 09.11.2010
comment
Кроме того, позвольте мне добавить, что PyTables очень прост в использовании, в отличие от C / C ++ API, который переводит h5py. Преимущество подхода h5py заключается в том, что он позволяет быстрее изучить оба API, если они похожи. - person AFoglia; 09.11.2010
comment
Спасибо, что указали, как отключить все эти дополнительные метаданные в PyTables, я думаю, что исправлюсь по этому поводу. Однако h5py предоставляет питонический интерфейс очень высокого уровня для объектов HDF5, это так же просто, как доступ к массиву numpy. Это определенно не просто тонкая обертка вокруг C API. - person DaveP; 10.11.2010

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

In [17]: x = np.zeros(10, dtype=np.object)
In [18]: x[3] = {'pants', 10}
In [19]: x
Out[19]: array([0, 0, 0, set([10, 'pants']), 0, 0, 0, 0, 0, 0], dtype=object)
person Autoplectic    schedule 08.11.2010
comment
Извините, забыл написать ... Мне нужен кросс-языковой доступ ... (с C / C ++) - person illegal-immigrant; 08.11.2010