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

他们如何比较?

我需要对元数据的支持(能够接收文件并无需任何其他信息/文件),快速读取/写入操作,存储动态数据的功能将是一个加号(例如Python对象)

我已经知道的事情:

  • numpy 非常快,但无法存储动态数据(例如Python对象)。 (元数据呢?)
  • HDF5 非常快,支持自定义属性,易于使用,但不能存储Python对象。 HDF5也本地序列化Numpy数据,因此,IMHO,Numpy没有HDF5的优势
  • Google协议缓冲区 支持自我描述也很快(但是Python目前的支持很差,缓慢而越野)。可以存储动态数据。缺点 - 自我描述不能从python中起作用,> = 1 MB的消息序列化/挑选性不是很快(阅读“慢”)。

PS:我需要传输的数据是numpy/scipy的“工作结果”(阵列,复杂的结构等级等)

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

有帮助吗?

解决方案

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

如果您需要跨语言访问权限,我建议使用HDF5,因为它是一种文件格式,专门设计为独立于语言,操作系统,系统体系结构(例如,加载它可以自动转换,可以自动转换),专门针对执行科学/数值计算的用户。我对Google协议缓冲区的了解不多,因此我对此并没有太多评论。

如果您决定使用HDF5,我也建议您使用 H5PY 而不是Pytables。这是因为Pytables创建了带有大量额外的Pythonic元数据的HDF5文件,这使得在C/C ++中读取数据更多的痛苦,而H5PY并没有创建任何这些附加功能。您可以找到比较 这里, ,他们还提供了指向Pytables常见问题解答的链接,以便您决定哪种最适合您的需求。

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

其他提示

我不知道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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top