从 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 文件中删除信息的主要内容,如果未能解决你的问题,请参考以下文章