Google Protocol Buffers, HDF5, сравнение NumPy (передача данных) - PullRequest
13 голосов
/ 08 ноября 2010

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

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

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

Вещи, которые я уже знаю:

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

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

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

Ответы [ 2 ]

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

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

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

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

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

3 голосов
/ 08 ноября 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)
...