我有许多 hdf5 文件,每个文件都有一个数据集。数据集太大,无法保存在 RAM 中。我想将这些文件组合成一个单独包含所有数据集的文件(即 不要 将数据集连接成一个数据集)。
一种方法是创建一个 hdf5 文件,然后一个一个地复制数据集。这将是缓慢而复杂的,因为它需要缓冲副本。
有没有更简单的方法来做到这一点?似乎应该有,因为它本质上只是创建一个容器文件。
我正在使用 python/h5py。
原文由 Bitwise 发布,翻译遵循 CC BY-SA 4.0 许可协议
这实际上是 HDF5 的用例之一。如果您只想能够从单个文件访问所有数据集,而不关心它们实际如何存储在磁盘上,则可以使用 外部链接。来自 HDF5 网站:
外部链接允许一个组将对象包含在另一个 HDF5 文件中,并使库能够访问这些对象,就像它们在当前文件中一样。以这种方式,一个组可能看起来直接包含数据集、命名数据类型,甚至是实际上位于不同文件中的组。此功能是通过一组函数实现的,这些函数创建和管理链接、定义和检索外部对象的路径以及解释链接名称:
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 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答937 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
一种解决方案是使用
h5py
接口到低级H5Ocopy
HDF5 API 的 函数,特别是h5py.h5o.copy
函数:The above was generated with
h5py
version2.0.1-2+b1
and iPython version0.13.1-2+deb7u1
atop Python version2.7.3-4+deb7u1
from a more-or-less vanilla install of Debian 喘息。文件f1.h5
和f2.h5
在执行上述操作之前不存在。 请注意,根据 salotz ,对于 Python 3,数据集/组名称需要是bytes
(例如b"val"
),而不是str
命令中的 ---
hf1.flush()
[7]
是至关重要的,因为低级接口显然总是从.h5
文件的版本中提取存储在磁盘上的文件,而不是缓存的文件在记忆中。将数据集复制到/从不在File
的根的组可以通过使用例如hf1.get("g1").id
提供该组的 ID 来实现。请注意
h5py.h5o.copy
如果指定名称的对象已存在于目标位置,则将失败并出现异常(无破坏)。