hdf5 - 从 HDF5 文件中删除数据

标签 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 专家的任何提示?

    最佳答案

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

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

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

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

    关于hdf5 - 从 HDF5 文件中删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124994/

    相关文章:

    python - 用于读取行的最佳 HDF5 数据集 block 形状

    machine-learning - 使用hdf5作为caffe输入,错误: HDF5Data does not transform data

    python - Pandas 过滤并转换为日期到 datetime64ns

    python - 从 Oracle 读取一个包含数百万行的大表并写入 HDF5

    python - 如何在不耗尽内存的情况下读取 tsv 文件并将它们存储为 hdf5?

    python - 无法修改较大数据集中的项目

    python - 从被抓取的页面上的链接中检索信息

    C++ 空指针

    python - 在 Pandas 中查询 HDF5

    c++ - 隐藏复合数据类型的某些字段以防止写入(或读回)hdf5 文件