Google Protocol Buffers, HDF5, NumPy 数据传输对比
我需要一些帮助来做决定。我在我的应用程序中需要传输一些数据,现在需要在这三种技术之间做选择。
我对这三种技术都了解了一点(看了一些教程和文档),但还是无法决定……
它们之间有什么比较呢?
我需要支持元数据(也就是能够接收文件并在没有额外信息或文件的情况下读取它),快速的读写操作,能够存储动态数据会是个加分项(比如Python对象)。
我已经知道的一些事情:
- NumPy速度很快,但不能存储动态数据(比如Python对象)。(那元数据呢?)
- HDF5速度非常快,支持自定义属性,使用起来也很简单,但不能存储Python对象。HDF5可以原生序列化NumPy数据,所以在我看来,NumPy对HDF5没有优势。
- Google Protocol Buffers也支持自描述,速度也很快(但目前Python的支持比较差,慢而且有bug)。可以存储动态数据。缺点是自描述在Python中无法使用,而且大于等于1MB的消息序列化和反序列化速度不快(可以理解为“慢”)。
附注:我需要传输的数据是NumPy/SciPy的“工作结果”(数组、复杂结构的数组等)。
更新:需要跨语言访问(C/C++/Python)。
2 个回答
我对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)
你的问题里似乎有一点矛盾——你想存储Python对象,但又希望能用C/C++访问。我觉得无论你选择哪种方式,你都需要把那些复杂的Python数据结构转换成更简单的结构,比如数组。
如果你需要跨语言访问,我建议你使用HDF5。这是一种文件格式,专门设计成与编程语言、操作系统和系统架构无关(比如在加载时,它可以自动在大端和小端之间转换),而且特别适合做科学和数值计算的用户。我对Google Protocol Buffers了解不多,所以没法多说。
如果你决定使用HDF5,我还建议你用h5py,而不是pytables。因为pytables在创建HDF5文件时,会加很多额外的Python元数据,这样在C/C++中读取数据就会比较麻烦,而h5py则不会添加这些额外的东西。你可以在这里找到它们的比较,他们也提供了pytables的常见问题链接,你可以根据自己的需求来决定哪个更适合你。
还有一种格式和HDF5非常相似,那就是NetCDF。它也有Python的接口,不过我没有使用过这个格式,所以只能告诉你它的存在,并且它在科学计算中也被广泛使用。