17

我意识到一个 SO 用户以前曾问过这个问题,但它是在 2009 年被问到的,我希望有更多关于 HDF5 的知识或更新的版本已经解决了这个特定问题。在这里重申关于我自己的问题的问题;

我有一个来自大型几何图形的节点和元素的巨大文件,并且已经从中检索到我需要的所有有用信息。因此,在 Python 中,我试图保留原始文件,但删除我不需要的信息并为其他来源填写更多信息。例如,我有一个不需要的节点数据集。但是,我需要保留相邻的数据集并从外部文件中包含有关其索引的信息。有没有办法删除这些特定的数据集?

还是在 HDF5 文件中使用“占位符”的旧想法仍然适用,以至于没有人知道如何/打扰删除信息?我不太担心空白空间,只要简单地删除和添加信息然后创建一个全新的文件会更快。

注意:我使用 H5py 的 'r+' 来读写。

4

3 回答 3

15

从 hdf5 文件中删除整个节点(组或数据集)应该没有问题。
但是,如果要回收空间,则必须运行该h5repack工具。

来自hdf5 文档

5.5.2. 从文件中删除数据集并回收空间

HDF5 目前不提供从文件中删除数据集或回收已删除对象占用的存储空间的简单机制。

可以使用 H5Ldelete 函数和 h5repack 实用程序来删除数据集并回收它使用的空间。使用 H5Ldelete 函数,可以从文件结构中删除指向数据集的链接。删除所有链接后,任何应用程序都无法访问该数据集,并有效地从文件中删除。恢复未链接数据集占用空间的方法是将文件的所有对象写入新文件。应用程序无法访问任何未链接的对象,并且不会包含在新文件中。可以使用自定义程序或使用 h5repack 实用程序将对象写入新文件。

或者,您也可以查看 PyTables 的ptrepack工具。PyTables 应该能够读取 h5py hdf5 文件并且该ptrepack工具类似于h5repack.

如果要从数据集中删除记录,则可能必须检索要保留的记录并创建新数据集并删除旧数据集。
PyTables 支持删除行,但不建议这样做。

于 2012-06-26T19:41:59.923 回答
1

如果您知道特定数据集将在分析过程结束时被删除,为什么还要将其保留在主文件中?我会将临时数据存储在单独的 HDF5 文件中,分析完成后可以将其丢弃。如果在主文件中链接临时数据集很重要,只需使用 H5Lcreate_external() 在主文件和临时文件之间创建一个外部链接。外部链接占用的空间很小。

于 2017-09-27T11:54:04.960 回答
0

在 HDF5 1.10 及以上版本中,有一种文件空间管理机制。可以通过在H5F.create中指定 fcpl(File Creation Property List) 来实现。

您会注意到的一个重要变化是第一次导入后的文件在第一次导入时会稍大一些(以 Kb 为单位)。但在那之后,您的文件大小最终会变小(在回收过程之后)。

您可以使用h5stat工具监控 HDF5 文件中的可用空间

h5stat -S filename
于 2018-08-28T05:29:19.630 回答