Google Protocol Buffers, HDF5, NumPy 数据传输对比

18 投票
2 回答
7804 浏览
提问于 2025-04-16 06:44

我需要一些帮助来做决定。我在我的应用程序中需要传输一些数据,现在需要在这三种技术之间做选择。

我对这三种技术都了解了一点(看了一些教程和文档),但还是无法决定……

它们之间有什么比较呢?

我需要支持元数据(也就是能够接收文件并在没有额外信息或文件的情况下读取它),快速的读写操作,能够存储动态数据会是个加分项(比如Python对象)。

我已经知道的一些事情:

  • NumPy速度很快,但不能存储动态数据(比如Python对象)。(那元数据呢?)
  • HDF5速度非常快,支持自定义属性,使用起来也很简单,但不能存储Python对象。HDF5可以原生序列化NumPy数据,所以在我看来,NumPy对HDF5没有优势。
  • Google Protocol Buffers也支持自描述,速度也很快(但目前Python的支持比较差,慢而且有bug)。可以存储动态数据。缺点是自描述在Python中无法使用,而且大于等于1MB的消息序列化和反序列化速度不快(可以理解为“慢”)。

附注:我需要传输的数据是NumPy/SciPy的“工作结果”(数组、复杂结构的数组等)。

更新:需要跨语言访问(C/C++/Python)。

2 个回答

4

我对HDF5不太了解,不过你可以把Python对象存储在NumPy数组里,只是这样会失去很多重要的功能,因为不允许在数组上进行一些底层的操作。

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)
13

你的问题里似乎有一点矛盾——你想存储Python对象,但又希望能用C/C++访问。我觉得无论你选择哪种方式,你都需要把那些复杂的Python数据结构转换成更简单的结构,比如数组。

如果你需要跨语言访问,我建议你使用HDF5。这是一种文件格式,专门设计成与编程语言、操作系统和系统架构无关(比如在加载时,它可以自动在大端和小端之间转换),而且特别适合做科学和数值计算的用户。我对Google Protocol Buffers了解不多,所以没法多说。

如果你决定使用HDF5,我还建议你用h5py,而不是pytables。因为pytables在创建HDF5文件时,会加很多额外的Python元数据,这样在C/C++中读取数据就会比较麻烦,而h5py则不会添加这些额外的东西。你可以在这里找到它们的比较,他们也提供了pytables的常见问题链接,你可以根据自己的需求来决定哪个更适合你。

还有一种格式和HDF5非常相似,那就是NetCDF。它也有Python的接口,不过我没有使用过这个格式,所以只能告诉你它的存在,并且它在科学计算中也被广泛使用。

撰写回答