【问题标题】:Opening already opened hdf5 file in write mode, using h5py使用 h5py 以写入模式打开已打开的 hdf5 文件
【发布时间】:2018-09-15 20:19:34
【问题描述】:

我以不同的进程同时运行同一个 Python 程序,并且这些都想使用 h5py Python 包写入同一个 hdf5 文件。但是,只有单个进程可以以写入模式打开给定的hdf5 文件,否则会报错

OSError: 无法打开文件(无法锁定文件,errno = 11,错误 message = '资源暂时不可用')

在处理上述异常的过程中,又发生了一个异常:

OSError: 无法创建文件(无法打开文件:name = 'test.hdf5',errno = 17,错误消息 = '文件存在',标志 = 15, o_flags = c2)

我想通过检查文件是否已经以写入模式打开来解决此问题,如果是,请稍等并再次检查,直到不再以写入模式打开。我还没有找到h5pyhdf5 的任何此类检查功能。到目前为止,我的解决方案是基于此:

from time import sleep
import h5py

# Function handling the intelligent hdf5 file opening
def open_hdf5(filename, *args, **kwargs):
    while True:
        try:
            hdf5_file = h5py.File(filename, *args, **kwargs)
            break  # Success!
        except OSError:
            sleep(5)  # Wait a bit
    return hdf5_file

# How to use the function
with open_hdf5(filename, mode='a') as hdf5_file:
    # Do stuff
    ...

我不确定我是否喜欢这个,因为它看起来不太温和。有没有更好的方法来做到这一点?我在try 中打开文件的错误尝试是否会以某种方式破坏另一个进程中正在进行的写入过程?

【问题讨论】:

  • 我猜你已经检查了手册中提到的可能性,包括 SWMR 功能。 docs.h5py.org/en/latest/mpi.html#using-parallel-hdf5-from-h5py 如果您不能使用这些功能或不想使用它们,为什么不使用单个进程来读取/写入 HDF5 文件?通常单线程 I/O 并不是真正的瓶颈。例如,正确使用 chunk-chache/最小化 API 调用更为重要。
  • 我的问题不在于性能。我只是有多个进程(原则上彼此无关)试图一次写入同一个文件。让进程等到文件没有被任何其他进程以写入模式打开后再尝试打开文件本身是没有问题的。

标签: python multiprocessing hdf5 h5py file-writing


【解决方案1】:

通过快速研究判断,没有独立于平台的方法来检查文件是否已经处于打开写入模式。 How to check whether a file is_open and the open_status in python https://bytes.com/topic/python/answers/612924-how-check-whether-file-open-not

但是,由于您已经定义了一个用于读取写入 hdf5 文件的包装器打开读/写方法,因此当您有一个成功打开 hdf5 文件的进程时,您始终可以创建一个“file_name”.lock 文件.

那么你所要做的就是使用 os.path.exists('"file_name".lock') 知道你是否可以在写模式下打开文件。

本质上,你所做的事情并没有太大的不同。但是首先,您可以查看文件系统以查看您的某个进程是否以写入模式访问文件,其次测试不是异常的产物,因为 os.path.exists 将返回一个布尔值。

许多应用程序都使用这种技巧。在 CVS 存储库中漫游时,您经常会看到 .lock 文件在周围......

【讨论】:

  • 唯一的问题是 pytables 似乎不能很好地自行清理,导致大量文件以不可预知的方式打开。
猜你喜欢
  • 2014-12-24
  • 2011-12-02
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多