我需要帮助才能做出决定。我需要在我的应用程序中传输一些数据,并且必须在这三种技术之间做出选择。 我已经阅读了所有技术(教程,文档),但仍无法决定......
他们如何比较?
我需要元数据的支持(接收文件的能力和没有任何附加信息/文件的读取),快速读/写操作,存储动态数据的能力将是一个加号(如Python对象)
我已经知道的事情:
PS:我需要传输的数据是NumPy / SciPy的“工作结果”(数组,复杂结构数组等)
UPD:需要跨语言访问(C / C ++ / Python)
答案 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)