我对这个问题有几个疑问。我意识到这可能是一篇复杂的文章,可以提供额外的细节。
我使用的代码包可以生成大型 .h5 文件 (source.h5) (100+ Gb),其中几乎所有数据都驻留在 1 个数据集 (group2/D) 中。我想使用 Python 创建一个新的 .h5 文件 (dest.h5),其中包含除 source.h5 的 group2/D 之外的所有数据集,而无需复制整个文件。然后,我将在一些后处理后压缩 group2/D 并在 dest.h5 中用更少的数据编写一个新的 group2/D 。但是,我需要保留 source.h5,因为此后处理可能需要在多个目标文件中多次执行。
source.h5 的结构始终相同,并且不能在 source.h5 或 dest.h5 中更改,其中每个字母都是一个数据集:
group1/A
group1/B
group2/C
group2/D
因此,我想最初创建一个具有以下格式的文件:
group1/A
group1/B
group2/C
稍后再次填写 group2/D。简单地多次复制 source.h5 总是可以的,但我想避免多次复制一个大文件,因为磁盘空间有限,而且这不是一次性的情况。
我搜索并发现了这个问题(如何使用 python 将 Hdf5 文件部分复制到保持相同结构的新文件中? https://stackoverflow.com/questions/24510240/how-to-partially-copy-using-python-an-hdf5-file-into-a-new-one-keeping-the-same)并测试 dest.h5 是否与 source.h5 相同:
fs = h5py.File('source.h5', 'r')
fd = h5py.File('dest.h5', 'w')
fs.copy('group1', fd)
fd.create_group('group2')
fs.copy('group2/C', fd['/group2'])
fd.copy('group2/D', fd['/group2'])
fs.close()
fd.close()
但是我使用的代码包无法读取我创建的文件(我一定会发生这种情况),这意味着当我执行此操作时存在一些关键数据丢失(文件大小也相差 7 kb)。我假设问题出在我手动创建 group2 时,因为我使用 numpy 检查了 group1 数据集中的值在 source.h5 和 dest.h5 中完全匹配。在深入研究丢失的数据之前,我想先弄清楚一些事情:
问题一:每个组或数据集是否附带 .h5 文件元数据?如果是这样,我怎样才能看到它,以便我可以在 dest.h5 中创建一个与 source.h5 中的完全匹配的 group2 ?有没有办法查看 2 个组(不是数据集)是否完全匹配?
问题2:或者,是否可以简单地复制 .h5 文件的数据结构(即具有空列表的组和数据集作为骨架文件),以便稍后可以填充字段?或者,作为这个问题的一个子集,有没有办法将空白数据集复制到另一个文件,以便保留任何元数据(假设有一些元数据)?
问题3:最后,为了避免这一切,是否可以将 source.h5 的子集复制到 dest.h5 ?像这样的东西:
fs.copy(['group1','group2/C'], fd)
谢谢你的时间。感谢您读到这里