合并 hdf5 文件

新手上路,请多包涵

我有许多 hdf5 文件,每个文件都有一个数据集。数据集太大,无法保存在 RAM 中。我想将这些文件组合成一个单独包含所有数据集的文件(即 不要 将数据集连接成一个数据集)。

一种方法是创建一个 hdf5 文件,然后一个一个地复制数据集。这将是缓慢而复杂的,因为它需要缓冲副本。

有没有更简单的方法来做到这一点?似乎应该有,因为它本质上只是创建一个容器文件。

我正在使用 python/h5py。

原文由 Bitwise 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

一种解决方案是使用 h5py 接口到低级 H5Ocopy HDF5 API 的 函数,特别是 h5py.h5o.copy 函数

 In [1]: import h5py as h5

In [2]: hf1 = h5.File("f1.h5")

In [3]: hf2 = h5.File("f2.h5")

In [4]: hf1.create_dataset("val", data=35)
Out[4]: <HDF5 dataset "val": shape (), type "<i8">

In [5]: hf1.create_group("g1")
Out[5]: <HDF5 group "/g1" (0 members)>

In [6]: hf1.get("g1").create_dataset("val2", data="Thing")
Out[6]: <HDF5 dataset "val2": shape (), type "|O8">

In [7]: hf1.flush()

In [8]: h5.h5o.copy(hf1.id, "g1", hf2.id, "newg1")

In [9]: h5.h5o.copy(hf1.id, "val", hf2.id, "newval")

In [10]: hf2.values()
Out[10]: [<HDF5 group "/newg1" (1 members)>, <HDF5 dataset "newval": shape (), type "<i8">]

In [11]: hf2.get("newval").value
Out[11]: 35

In [12]: hf2.get("newg1").values()
Out[12]: [<HDF5 dataset "val2": shape (), type "|O8">]

In [13]: hf2.get("newg1").get("val2").value
Out[13]: 'Thing'

The above was generated with h5py version 2.0.1-2+b1 and iPython version 0.13.1-2+deb7u1 atop Python version 2.7.3-4+deb7u1 from a more-or-less vanilla install of Debian 喘息。文件 f1.h5f2.h5 在执行上述操作之前不存在。 请注意,根据 salotz ,对于 Python 3,数据集/组名称需要是 bytes (例如 b"val" ),而不是 str

命令中的 --- hf1.flush() [7] 是至关重要的,因为低级接口显然总是从 .h5 文件的版本中提取存储在磁盘上的文件,而不是缓存的文件在记忆中。将数据集复制到/从不在 File 的根的组可以通过使用例如 hf1.get("g1").id 提供该组的 ID 来实现。

请注意 h5py.h5o.copy 如果指定名称的对象已存在于目标位置,则将失败并出现异常(无破坏)。

原文由 hBy2Py 发布,翻译遵循 CC BY-SA 4.0 许可协议

这实际上是 HDF5 的用例之一。如果您只想能够从单个文件访问所有数据集,而不关心它们实际如何存储在磁盘上,则可以使用 外部链接。来自 HDF5 网站

外部链接允许一个组将对象包含在另一个 HDF5 文件中,并使库能够访问这些对象,就像它们在当前文件中一样。以这种方式,一个组可能看起来直接包含数据集、命名数据类型,甚至是实际上位于不同文件中的组。此功能是通过一组函数实现的,这些函数创建和管理链接、定义和检索外部对象的路径以及解释链接名称:

以下是如何在 h5py 中执行此操作

 myfile = h5py.File('foo.hdf5','a')
myfile['ext link'] = h5py.ExternalLink("otherfile.hdf5", "/path/to/resource")

注意: 打开 myfile 时,如果它是一个现有文件,你应该用 'a' 打开它。如果你用 'w' 打开它,它会清除它的内容。

这比将所有数据集复制到一个新文件要快得多。我不知道访问 otherfile.hdf5 的速度有多快,但是对所有数据集的操作都是透明的——也就是说,h5py 会将所有数据集视为驻留在 foo.hdf5 中。

原文由 Yossarian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题