2

当我使用 NumPy 时,我以原生格式 *.npy 存储它的数据。它非常快并且给了我一些好处,比如这个

  • 我可以从 C 代码中读取 *.npy 作为简单的二进制数据(我的意思是 *.npy 与 C 结构二进制兼容)

现在我正在处理 HDF5(此时 PyTables)。正如我在教程中所读到的,他们使用 NumPy 序列化程序来存储 NumPy 数据,所以我可以从 C 中读取这些数据,就像从简单的 *.npy 文件中一样?

HDF5 的 numpy 是否也与 C 结构二进制兼容?

更新:

我有 matlab 客户端从 hdf5 读取,但不想从 C++ 读取 hdf5,因为从 *.npy 读取二进制数据要快几倍,所以我真的需要从 C++ 读取 hdf5(二进制兼容性)所以我已经使用两种方式来传输数据 - *.npy(从 C++ 读取为字节,从 Python 本地读取)和 hdf5(从 Matlab 访问)如果可能的话,想使用唯一的一种方式 - hdf5,但要做到这一点我有找到一种方法使 hdf5 与 C++ 结构二进制兼容,请帮助,如果有某种方法可以关闭 hdf5 中的压缩或其他方式使 hdf5 与 C++ 结构二进制兼容 - 告诉我在哪里可以读到它...

4

3 回答 3

9

从 C 中读取 hdf5 文件的正确方法是使用 hdf5 API - 请参阅本教程。原则上,可以像使用 .npy 文件一样直接从 hdf5 文件中读取原始数据,前提是您没有在 hdf5 文件中使用压缩等高级存储选项。然而,这基本上违背了使用 hdf5 格式的全部意义,我想不出这样做有什么好处,而不是使用正确的 hdf5 API。另请注意,API 有一个简化的高级版本,它应该使从 C 中读取相对轻松。

于 2010-11-09T12:22:06.940 回答
1

我感觉到你的痛苦。我一直在广泛处理存储在 HDF5 格式文件中的大量数据,并且收集了一些您可能会觉得有用的信息。

如果您在“控制”文件创建(和写入数据——即使您使用 API),您应该能够在很大程度上完全绕过 HDF5 库。

如果您的输出数据集没有分块,它们将被连续写入。只要您没有在数据类型定义中指定任何字节顺序转换(即您指定数据应以本机浮点/双精度/整数格式写入),您应该能够实现“二进制兼容性”它。

为了解决我的问题,我使用文件规范http://www.hdfgroup.org/HDF5/doc/H5.format.html编写了一个 HDF5 文件解析器

使用相当简单的解析器,您应该能够识别任何数据集的偏移量(和大小)。那时只需 fseek 和 fread(在 C 中,也就是说,也许您可​​以在 C++ 中采用更高级别的方法)。

如果您的数据集是分块的,则需要更多的解析来遍历用于组织块的 b 树。

您应该注意的唯一其他问题是处理任何(或消除)任何与系统相关的结构填充。

于 2010-11-10T00:57:51.477 回答
0

HDF5 为您处理结构的二进制兼容性。您只需告诉它您的结构由 (dtype) 组成,保存/读取记录数组不会有任何问题 - 这是因为类型系统在 numpy 和 HDF5 之间基本上是 1:1。如果您使用 H5py,我有信心说 IO 应该足够快,只要您使用所有本机类型和大批量读取/写入 - 允许的整个数据集。之后,它取决于分块和过滤器(例如随机播放、压缩) - 还值得注意的是,有时这些可以通过大大减小文件大小来加快速度,因此请始终查看基准。请注意,类型和过滤器选择是在创建 HDF5 文档的最后进行的。

如果您尝试自己解析 HDF5,那么您做错了。如果您使用 C++/C 工作,请使用 C++ 和 C API。HDF5 组网站上有所谓的“复合类型”示例。

于 2015-05-03T01:56:46.640 回答