创建HDF5文件时不关闭文件会导致文件损坏 (h5py)

6
我正在使用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语句的方法,但当会话意外结束时,我不确定是否有帮助。
  2. 是否有一种方法可以恢复损坏文件中的数据?是否有可用的修复程序?
每次写入访问都始终打开和关闭文件对我来说听起来不是很理想,因为我正在从许多不同的函数和线程连续写入数据。所以我更喜欢另一种解决方案。
2个回答

5
腐败问题已为HDF5设计者所知。他们正在通过添加日志记录来修复此问题,在1.10版本中。同时,您可以定期调用flush()以确保您的写入已刷新,这应该可以最小化一些损坏。您也可以尝试使用外部链接,这将允许您将数据片段存储在单独的文件中,但在读取时将它们链接成一个结构。

3
显然,他们已经从1.10版本中删除了日志记录功能:https://hdfgroup.org/wp/2015/05/whats-coming-in-the-hdf5-1-10-0-release/ - Ben Farmer
在写入数据后进行flush()确实有帮助。即使您在此之后写入了未经过刷新的数据,最近一次刷新点之前的所有内容仍然可以访问。不知何故,当我一年前尝试时它并没有像预期的那样工作。 - erik

2

如果发生例如停电的情况,无法防止文件损坏,你能做的只是最小化损失。一种方式是使用冗余备份。你可以使用两个文件代替一个文件,任何时候只打开其中一个文件。例如,打开文件1时,将所有更改写入文件1。在一定时间或写入一定数量的数据后,关闭它,从文件1更新文件2,然后继续轮流写入文件2等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接