Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: illegal-immigrantОтветов: 2

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

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

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

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

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

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

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

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

pythonnumpyhdf5

Ответы

Ответ 1 · рейтинг 13 · DaveP

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

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

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

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

Ответ 2 · рейтинг 4 · Autoplectic

Я не знаю насчет 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы