【问题标题】:HDF5 : storing NumPy dataHDF5:存储 NumPy 数据
【发布时间】:2011-05-07 04:59:36
【问题描述】:

当我使用 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++ 结构二进制兼容的东西 - 告诉我在哪里可以读到它...

【问题讨论】:

  • 您是说您已经在 C++ 中实现了从 hdf5 文件中读取的代码,并且您发现它比从 .npy 文件中读取要慢得多?另外,我相当确定 matlab 可以读取原始二进制文件,所以如果这是您使用 hdf5 的唯一原因,也许您应该更仔细地研究将 .npy 文件读入 matlab。
  • 不,我正在从 C++ 中读取 *.npy 作为二进制数据,并想用 hdf5 来做这个技巧。从 MATLAB 中读取 *.npy 似乎很成问题
  • HDF5默认没有压缩。

标签: python c numpy hdf5 pytables


【解决方案1】:

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

【讨论】:

  • 查看我的更新,我添加了一些细节。您能否写更多关于直接从 hdf5 读取原始数据的内容(以及如何关闭 hdf5 中的压缩和其他存储选项)
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 填充不会有问题,我会解决的。谢谢您的回复
  • 没有人应该需要访问这样的数据。如果您遵守 HDF5 中的性能原则,这太冒险了,如果不是真的要提高速度的话。不仅如此,如果有人不使用本机类型或在数据集中有更多填充/变量怎么办?谁知道会吐出什么客户端平台。这是一个脆弱而危险的建议,它在很大程度上否定了制造 HDF5 的原因。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 2012-06-23
    • 2020-10-01
    • 2014-01-22
    • 2012-12-29
    • 2013-05-05
    • 2015-09-18
    • 2015-10-02
    相关资源
    最近更新 更多