从HDF5文件中删除信息

时间:2012-06-25 18:15:37

标签: python hdf5

我意识到SO用户以前曾问过这个问题question,但在2009年被问到,我希望有更多关于HDF5的知识,或者新版本已经修复了这个特定问题。在此重述有关我自己问题的问题;

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

或者在HDF5文件中保留“放置管理员”的旧想法仍然是真的,这样就没有人知道删除信息是多么困难?我不太担心空白区域,只要简单地删除和添加信息然后创建一个全新的文件就更快了。

注意:我正在使用H5py的'r +'进行读写。

3 个答案:

答案 0 :(得分:15)

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

来自hdf5 docs

  

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

     

HDF5此时不提供一种简单的删除机制   来自文件的数据集或回收a占用的存储空间   删除了对象。

     

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在HDF5 1.10及更高版本中,存在file space management机制。可以通过在H5F.create中指定fcpl(文件创建属性列表)来实现。

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

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

h5stat -S filename