在不关闭文件的情况下创建 HDF5 文件时文件损坏 (h5py)

Corrupt files when creating HDF5 files without closing them (h5py)

我正在使用 h5py 将实验数据存储在 HDF5 容器中。

在交互式会话中,我使用以下方式打开文件:

measurement_data = h5py.File('example.hdf5', 'a')

然后我使用一些自己编写的函数将数据写入文件(可以是几天实验的许多GB数据)。在实验结束时,我通常会使用

关闭文件
measurement_data.close()

不幸的是,有时会发生这种情况,即交互式会话在我没有明确关闭文件的情况下结束(意外终止会话、断电、OS 由于某些其他软件崩溃)。这总是会导致文件损坏和完整数据丢失。当我尝试打开它时,出现错误:

OSError: Unable to open file (File signature not found)

我也无法在 HDFview 或我试过的任何其他软件中打开该文件。

  1. 有没有办法避免损坏的文件,即使它没有明确关闭?我读过有关使用 with 语句 here 的信息,但我不确定在会话意外结束时这是否有帮助。
  2. 我可以通过某种方式恢复损坏文件中的数据吗?有可用的修复程序吗?

总是为每次写入访问打开和关闭文件听起来对我来说很不利,因为我不断地从许多不同的函数和线程写入数据。所以我会更喜欢不同的解决方案。

没有什么能阻止文件在例如发生的情况下被破坏。停电。你能做的就是把伤害降到最低。一种方法是使用冗余。您使用两个文件而不是一个文件,并且任何时候都只能打开其中一个。假设文件 1 打开,您将所有更改写入文件 1。经过一定时间或写入一定数量的数据后,关闭它,从文件 1 更新文件 2,然后继续写入文件 2,依此类推。

损坏问题已为 HDF5 设计人员所知。他们正致力于通过 adding journalling. In the mean time you can call flush() periodically to make sure your writes have been flushed, which should minimise some of the damage. You can also try to use external links 在 1.10 版中修复此问题,这将允许您将数据片段存储在单独的文件中,但 link 在您阅读它们时将它们组合成一个结构。