从 HDF5 文件中删除信息

Posted

技术标签:

【中文标题】从 HDF5 文件中删除信息【英文标题】:Deleting information from an HDF5 file 【发布时间】:2012-06-27 00:55:36 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

来自hdf5 docs:

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

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

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

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

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

【讨论】:

非常感谢您的详细解释和有用的链接!这正是我所需要的。 谢谢。情况仍然如此。以编程方式探索/确认here。 愚蠢的问题:如果我删除整个 .h5 文件,它会回收磁盘空间吗?【参考方案2】:

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

【讨论】:

【参考方案3】:

在HDF5 1.10及以上版本中,有file space management的机制。可以通过在H5F.create中指定fcpl(File Creation Property List)来实现。

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

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

h5stat -S filename

【讨论】:

以上是关于从 HDF5 文件中删除信息的主要内容,如果未能解决你的问题,请参考以下文章

删除或更新 HDF5 中的数据集?

使用 h5py 删除 hdf5 数据集

无法从自制软件安装 hdf5 库

有没有办法从 HDF5 数据集中删除行?

将更多数据集附加到现有 Hdf5 文件中,而不删除其他组和数据集

Linux下rm -rf删除文件夹报错