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

时间:2010-11-08 16:34:36

标签: 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)

2 个答案:

答案 0 :(得分:12)

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

如果您需要跨语言访问,我建议使用HDF5,因为它是一种文件格式,专门设计为独立于语言,操作系统,系统架构(例如加载它可以在big-endian和little之间转换-endian自动),专门针对用户进行科学/数值计算。我对Google Protocol Buffers知之甚少,所以我不能对此做出过多评论。

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

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

答案 1 :(得分: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)