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

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

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

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

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

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

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

UPD: требуется перекрестный доступ (C/С++/Python)

Ответ 1

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

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

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

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

Ответ 2

Я не знаю о 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)