【问题标题】:Corrupt files when creating HDF5 files without closing them (h5py)创建 HDF5 文件而不关闭它们时损坏文件 (h5py)
【发布时间】:2015-09-26 01:45:02
【问题描述】:

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

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

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

然后我使用一些自写的函数将数据写入文件(几天的实验可能有很多 GB 的数据)。在实验结束时,我通常会使用关闭文件

measurement_data.close()

不幸的是,有时会发生交互会话结束而我没有明确关闭文件(意外终止会话、断电、由于某些其他软件导致操作系统崩溃)。这总是会导致文件损坏和完整数据丢失。当我尝试打开它时,我得到了错误:

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

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

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

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

【问题讨论】:

    标签: python corruption h5py


    【解决方案1】:

    HDF5 设计人员知道损坏问题。他们正在通过adding journalling 在版本 1.10 中修复此问题。同时,您可以定期致电flush() 以确保您的写入已被刷新,这样可以最大限度地减少一些损害。您也可以尝试使用external links,这将允许您将数据片段存储在单独的文件中,但在阅读它们时将它们链接到一个结构中。

    【讨论】:

    • 显然他们已经从 1.10 版本中删除了日记功能:hdfgroup.org/wp/2015/05/whats-coming-in-the-hdf5-1-10-0-release
    • 写完后对flush()确实有帮助。即使您之后写入未刷新的数据,也可以访问直到最近一次刷新的所有内容。由于某种原因,一年前我尝试它时它没有按预期工作。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2016-11-02
      • 2012-01-19
      • 2016-02-11
      • 2022-10-19
      相关资源
      最近更新 更多