使用h5py锁定HDF文件

问题描述 投票:0回答:5

我有一大堆通过 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

python-2.7 hdf5 h5py hdf
5个回答
2
投票

就我的这个问题的版本而言,它未能以一种晦涩的方法关闭文件。有趣的是,在某些情况下解锁文件只需重新启动 ipython,其他时候则需要完全重新启动。


2
投票

我没有意识到正在运行其他进程。我是如何解决我的问题的:

  1. 使用
    ps aux | grep myapp.py
    查找正在运行 myapp.py 的进程号。
  2. 使用
    kill
    命令终止进程
  3. 再跑一次

1
投票

使用 h5py.File(),可以多次打开同一个 .h5 文件进行读取(“r”)。但 h5py 不支持多个线程。您可能会在多个并发读取器的情况下遇到不良数据。


0
投票

与其他答案类似,我已经打开了该文件,但对我来说它是在单独的 HDF5 查看器中。


0
投票

对于我来说,我使用

multiprocessing
来并行化我的数据处理,并将文件句柄传递到多处理池。因此,即使我调用
close()
,文件也不会关闭,直到多处理池生成的所有子进程都终止为止。

如果您使用多重处理,请记住调用

join
close

        pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
        task_iter = pool.imap(...) # <- file is used in pool!
        ...
        pool.close()
        pool.join()
© www.soinside.com 2019 - 2024. All rights reserved.