17

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

他们如何比较?

我需要支持元数据(能够接收文件并在没有任何附加信息/文件的情况下读取它)、快速读/写操作、存储动态数据的能力将是一个加分项(如 Python 对象)

我已经知道的事情:

  • NumPy非常快,但不能存储动态数据(如 Python 对象)。(元数据呢?)
  • HDF5非常快,支持自定义属性,易于使用,但不能存储 Python 对象。HDF5 也原生序列化 NumPy 数据,因此,恕我直言,NumPy 与 HDF5 相比没有优势
  • Google Protocol Buffers也支持自我描述,速度非常快(但目前对 Python 的支持很差,速度慢而且有问题)。可以存储动态数据。缺点 - 自我描述在 Python 中不起作用,并且 >= 1 MB 的消息序列化/反序列化速度不是很快(阅读“慢”)。

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

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

4

2 回答 2

13

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

如果您需要跨语言访问,我建议使用 HDF5,因为它是一种专门设计为独立于语言、操作系统、系统架构的文件格式(例如,在加载时它可以自动在大端和小端之间转换) 并且专门针对进行科学/数值计算的用户。我对 Google Protocol Buffers 了解不多,所以我不能对此发表太多评论。

如果您决定使用 HDF5,我还建议您使用h5py而不是 pytables。这是因为 pytables 使用大量额外的 pythonic 元数据创建 HDF5 文件,这使得在 C/C++ 中读取数据更加痛苦,而 h5py 不会创建任何这些额外内容。您可以在此处找到比较,他们还提供了指向 pytables 常见问题解答的链接,以了解他们对此事的看法,这样您就可以决定最适合您的需求。

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

于 2010-11-08T22:06:42.057 回答
4

我不了解 HDF5,但是您可以将 Python 对象存储在 NumPy 数组中,您只是因为不允许在数组上执行 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)
于 2010-11-08T17:15:01.977 回答