从HDF5文件中删除数据

时间:2009-07-14 12:14:22

标签: hdf5

我有一个HDF5文件,其中包含复合元素的一维(N x 1)数据集 - 实际上它是一个时间序列。首先将数据离线收集到HFD5文件中,然后进行分析。在分析过程中,大多数数据都变得无趣,只有部分数据很有趣。由于数据集可能非常大,我想摆脱不感兴趣的元素,同时保留有趣的元素。例如,保留500个元素数据集的元素0-100和200-300和350-400,转储其余数据集。但是如何?

有没有人有过如何使用HDF5实现这一目标的经验?显然,它可以通过多种方式完成,至少:

  • (明显的解决方案),创建一个新的新文件并在那里逐个元素地写入必要的数据。然后删除旧文件。
  • 或者,在旧文件中,创建一个新的数据集,在那里写入必要的数据,使用H5Gunlink()取消链接旧数据集,并通过h5repack运行文件来摆脱无人认领的可用空间。
  • 或者,将现有数据集内的感兴趣元素朝向开始移动(例如,将元素200-300移动到位置101-201,将元素350-400移动到位置202-252)。然后调用H5Dset_extent()来减小数据集的大小。然后可以通过h5repack运行以释放可用空间。

由于即使删除了不感兴趣的元素,文件也可能非常大,我宁愿不重写它们(这需要很长时间),但似乎需要实际释放可用空间。来自HDF5专家的任何提示?

2 个答案:

答案 0 :(得分:9)

HDF5(至少我习惯的版本,1.6.9)不允许删除。实际上,它确实如此,但它没有释放已用空间,结果你仍然有一个巨大的文件。正如你所说,你可以使用h5repack,但这是浪费时间和资源。

你可以做的就是让横向数据集包含一个布尔值,告诉你哪些值是“活着的”以及哪些值已被删除。这不会使文件变小,但至少它为您提供了一种快速执行删除的方法。

另一种方法是在数组上定义一个slab,复制相关数据,然后删除旧数组,或者始终通过slab访问数据,然后根据需要重新定义(我从来没有这样做过,尽管,所以我不确定它是否可能,但它应该)

最后,您可以使用hdf5挂载策略将数据集放在挂载在根hdf5上的“附加”hdf5文件中。当你想要删除东西时,将有趣的数据复制到另一个已安装的文件中,卸载旧文件并将其删除,然后在适当的位置重新安装新文件。这个解决方案可能很乱(因为你有多个文件),但它允许你释放空间并只在数据树的子部分上操作,而不是使用重新包装。

答案 1 :(得分:2)

正如您所描述的那样,复制数据或使用h5repack是缩小'的两种常用方法。不幸的是,HDF5文件中的数据。

正如您可能已经猜到的那样,问题是HDF5文件具有复杂的内部结构(文件格式为here,对于任何好奇的人而言),因此删除和缩小内容只会留下漏洞。相同大小的文件。最新版本的HDF5库可以跟踪释放的空间并重新使用它,但您的用例似乎无法利用它。

正如另一个答案所提到的,您可以使用外部链接或虚拟数据集功能来构建更适合您将要进行的操作的HDF5文件,但我怀疑您是否会这样做仍在复制大量数据,这肯定会增加额外的复杂性和文件管理开销。

顺便说一句,H5Gunlink()已被弃用。 H5Ldelete()是首选替代品。