Google Protocol Buffers,HDF5,NumPy比较(传输数据)

ill*_*ant 14 python numpy hdf5

我需要帮助才能做出决定.我需要在我的应用程序中传输一些数据,并且必须在这三种技术之间做出选择.我已经阅读了所有技术(教程,文档),但仍然无法决定......

他们如何比较?

我需要支持元数据(接收文件的能力和没有任何附加信息/文件的读取),快速读/写操作,存储动态数据的能力将是一个加号(如Python对象)

我已经知道的事情:

  • NumPy非常快,但无法存储动态数据(如Python对象).(元数据怎么样?)
  • HDF5非常快,支持自定义属性,易于使用,但无法存储Python对象.此外,HDF5本地序列化NumPy数据,因此,恕我直言,NumPy没有优于HDF5的优势
  • Google Protocol Buffers也支持自我描述,速度相当快(但目前Python支持很差,速度慢且有问题).CAN存储动态数据.减少 - 自描述不适用于Python,并且> = 1 MB的消息不是非常快速地序列化/反序列化(读取"慢").

PS:我需要传输的数据是NumPy/SciPy的"工作结果"(数组,复杂结构的数组等)

UPD:需要跨语言访问(C/C++/Python)

Dav*_*veP 12

你的问题似乎有点矛盾 - 你希望能够存储Python对象,但你也想要C/C++访问.我认为无论你选择哪种选择,你都需要将你喜欢的Python数据结构转换为更多静态结构,例如数组.

如果您需要跨语言访问,我建议使用HDF5,因为它是一种文件格式,专门设计为独立于语言,操作系统,系统架构(例如加载它可以自动在big-endian和little-endian之间进行转换并且专门针对进行科学/数值计算的用户.我对Google协议缓冲区了解不多,所以我不能对此做太多评论.

如果您决定使用HDF5,我还建议您使用h5py而不是pytables.这是因为pytables创建了具有大量额外pythonic元数据的HDF5文件,这使得在C/C++中读取数据更加困难,而h5py不会创建任何这些额外内容.您可以在这里找到一个比较,他们还提供了pytables常见问题解答的链接,以便他们了解这个问题,以便您可以决定哪个最适合您的需求.

另一种与HDF5非常相似的格式是NetCDF.这也有Python绑定,但是我没有使用这种格式的经验,因此除了指出它存在并且也广泛用于科学计算之外,我无法发表评论.