我有一大堆通过 h5py 与 hdf 文件交互的代码。该代码已运行多年。最近,随着 python 环境的变化,我收到了这个新的错误消息。
IOError: Unable to open file (unable to lock file, errno = 11, error message = 'Resource temporarily unavailable')
有趣的是,该错误在某些地方间歇性地发生,而在其他地方持续发生。在经常发生这种情况的地方,我查看了我的代码并确认没有其他 h5py 实例连接到该文件,并且最后一个连接已正确刷新和关闭。同样,在环境发生变化之前,这一切都运行良好。
这是我的 conda 环境中的片段:
h5py 2.8.0 py27h470a237_0 conda-forge
hdf4 4.2.13 0 conda-forge
hdf5 1.10.1 2 conda-forge
就我的这个问题的版本而言,它未能以一种晦涩的方法关闭文件。有趣的是,在某些情况下解锁文件只需重新启动 ipython,其他时候则需要完全重新启动。
我没有意识到正在运行其他进程。我是如何解决我的问题的:
ps aux | grep myapp.py
查找正在运行 myapp.py 的进程号。kill
命令终止进程使用 h5py.File(),可以多次打开同一个 .h5 文件进行读取(“r”)。但 h5py 不支持多个线程。您可能会在多个并发读取器的情况下遇到不良数据。
与其他答案类似,我已经打开了该文件,但对我来说它是在单独的 HDF5 查看器中。
对于我来说,我使用
multiprocessing
来并行化我的数据处理,并将文件句柄传递到多处理池。因此,即使我调用 close()
,文件也不会关闭,直到多处理池生成的所有子进程都终止为止。
如果您使用多重处理,请记住调用
join
和 close
。
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
task_iter = pool.imap(...) # <- file is used in pool!
...
pool.close()
pool.join()