结合hdf5文件

Bit*_*ise 27 python hdf5 h5py

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

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

有更简单的方法吗?似乎应该有,因为它实际上只是创建一个容器文件.

我正在使用python/h5py.

Yos*_*ian 30

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

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

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

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

小心:在打开时myfile,你应该打开它'a',如果它是一个现有的文件.如果您打开它'w',它将删除其内容.

这比将所有数据集复制到新文件中要快得多.我不知道访问速度有多快otherfile.hdf5,但对所有数据集进行操作都是透明的 - 也就是说,h5py会看到所有数据集都存在foo.hdf5.

  • 这应该被选为问题的答案. (3认同)
  • 我只是尝试了您的建议,它使“ myfile”即98.5GB数据集960字节;我现在必须重新创建。没有警告或什么都没有-poof-98.5GB不见了! (2认同)

hBy*_*2Py 13

一种解决方案是将h5py接口用于HDF5 API 的低级H5Ocopy 功能,特别是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'
Run Code Online (Sandbox Code Playgroud)

上面是使用h5py版本2.0.1-2+b1和iPython版本0.13.1-2+deb7u1在Python 版本上生成的,2.7.3-4+deb7u1或多或少的Debian Wheezy安装.该文件f1.h5f2.h5之前执行上述不存在. 请注意,对于每个salotz,对于Python 3,数据集/组名称需要 bytes (例如 b"val"),而不是 str.

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

请注意,h5py.h5o.copy如果目标位置中已存在指定名称的对象,则会因异常(无clobber)而失败.

  • 我使用的是 `h5py` 2.7.1 和 python 3.6.5,字符串需要是字节,因此替换: `h5.h5o.copy(hf1.id, "g1", hf2.id, "newg1")`与 `h5.h5o.copy(hf1.id, b"g1", hf2.id, b"newg1")` (2认同)

Bit*_*ise 11

我使用官方hdf5工具中的h5copy找到了一个非python解决方案.h5copy可以将单个指定的数据集从hdf5文件复制到另一个现有的hdf5文件中.

如果有人找到基于python/h5py的解决方案,我会很高兴听到它.