2010-11-08 138 views
10

我需要帮助做出决定。我需要在应用程序中传输一些数据,并且必须在这三种技术之间进行选择。 我已阅读有关所有技术一点点(教程,文档),但仍不能决定...谷歌协议缓冲区,HDF5,NumPy比较(传输数据)

他们如何比较?

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

事我已经知道:

  • NumPy是非常快但不能存储动态数据(如Python对象)。 (关于元数据呢?)
  • HDF5速度非常快,支持自定义属性,易于使用,但不能存储Python对象。 也HDF5本地串行化NumPy数据,所以,恕我直言,NumPy没有HDF5的优势
  • Google Protocol Buffers也支持自我描述,速度很快(但Python支持当前时间较慢,而且缓慢)。可以存储动态数据。缺点 - 自我描述不适用于Python,大于等于1 MB的消息不是很快(读取“慢”)的序列化/反序列化。

PS:数据I需要转移是NumPy的/ SciPy的(阵列,复杂结构的阵列等)的 “工作的结果”

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

+0

如果您正在考虑HDF5,请使用PyTables。 http://www.pytables.org/moin它基本上允许您构建类,以便轻松快速地将元数据和numpy数组存储,重新创建和查询到HDF5。因为它只是将内容存储到HDF5中,所以您应该能够通过常用的库轻松访问C/C++中的内容。 – 2010-11-08 17:43:05

+0

是的,我知道PyTables,你很容易使用和跨语言,但他们不允许我存储Python对象... – 2010-11-08 18:05:37

回答

11

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

如果您需要跨语言访问,我会建议使用HDF5,因为它是专门设计为独立于语言,操作系统,系统架构的文件格式(例如在加载时可以在大端和小端自动),专门针对做科学/数值计算的用户。我对Google协议缓冲区了解不多,所以我不能在这方面做太多的评论。

如果您决定使用HDF5,我还建议您使用h5py而不是pytables。这是因为pytables创建了带有大量额外pythonic元数据的HDF5文件,这使得读取C/C++中的数据更加痛苦,而h5py不会创建任何这些额外内容。你可以找到一个比较here,他们也给出了关于这个问题的pytables FAQ的链接,所以你可以决定最适合你的需求。

与HDF5非常相似的另一种格式是NetCDF。这也有Python绑定,但是我没有使用这种格式的经验,所以除了指出它存在并且还被广泛用于科学计算之外,我不能真正评论它。

+0

感谢您的回应。我知道这三个人可能都不能完全满足我的需求,这就是为什么我在这里提出问题,选择真的有点难。 PS阅读Google昨天缓冲文档,并发现一个有趣的事情:它们不是设计用于传输大量数据(> 1MB),因此认为决定是关于NumPY和HDF5 .. – 2010-11-09 08:07:47

+1

PyTables添加的元数据是非常不显眼的,只是数据集的一些额外属性。您可以通过设置'tables.parameters.PYTABLES_SYS_ATTRS = False'或使用命名参数'PYTABLES_SYS_ATTRS = False'打开文件来关闭它。 – AFoglia 2010-11-09 20:48:43

+0

另外,让我补充一点,PyTables非常易于使用,与C/C++ API h5py转换不同。 h5py方法的好处是,如果两个API相似,学习这两种API的速度会更快。 – AFoglia 2010-11-09 20:50:47

2

我不知道HDF5,但你可与NumPy阵列店Python对象,你只是通过禁止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) 
+0

对不起,忘了写...我需要跨语言访问...... (来自C/C++) – 2010-11-08 17:21:34