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

Posted

技术标签:

【中文标题】删除或更新 HDF5 中的数据集?【英文标题】:Delete or update a dataset in HDF5? 【发布时间】:2010-10-01 15:54:23 【问题描述】:

我想以编程方式更改与 HDF5 文件中的数据集关联的数据。我似乎找不到按名称删除数据集(允许我用修改后的数据再次添加它)或按名称更新数据集的方法。我正在使用 HDF5 1.6.x 的 C API,但指向任何 HDF5 API 的指针都会很有用。

【问题讨论】:

【参考方案1】:

According to the user guide:

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

如此简单的删除似乎是不可能的。但该部分仍在继续:

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

【讨论】:

谢谢。知道 PyTables(一个构建在 HDF5 之上的 Python 引擎)是如何处理这个问题的吗? 在 PyTables 中“更改”表格的文档位于 pytables.org/moin/HintsForSQLUsers#Alteringatable,但请注意“PyTables 目前不支持(添加列)。” 在回答问题五年后获得匿名反对票很奇怪,特别是因为我的回答链接到相关文档,明确指出这在 2009 年是不可能的。是否添加了此功能? @MohiniMhetre:五年前我一直在研究 HDF5,但我从来没有认真对待过这个项目。我当然不是 HDF5 专家。据我记得,可以删除/更新数据;但即使您删除值,文件也不会缩小。使用更新的数据从头开始重新创建文件似乎更为常见。 更新:我不知道你可以依赖多少,但根据我使用最新 HDF5 库(1.8.10)的经验,我发现该文件在我使用H5Ldelete确实缩小了。这是有意为之还是偶然,我不知道。【参考方案2】:

如果你想在 C++ 中删除一个数据集,你需要以下命令:

H5File m_h5File (pathAndNameToHDF5File, H5F_ACC_RDWR); //The hdf5 c++ object.
std::string channelName = "/myGroup/myDataset";
int result = H5Ldelete(m_h5File.getId(), channelName.data(), H5P_DEFAULT);

如果成功,结果将是一个非负值;否则返回负值。 https://support.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Delete

正如@MaxLybbert 所说,它没有恢复的硬盘空间。您必须使用重新打包工具。 但是,使用 HDF5 v.1.10 可以恢复空间。但是用户指南还没有准备好:https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html

【讨论】:

以上是关于删除或更新 HDF5 中的数据集?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

从 HDF5 文件中删除数据

为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题

HDF5:将线性数组保存到三维数据集

读取存储在 HDF5 中的部分数据集 - python 2.7