以写模式打开已经打开的hdf5文件,使用h5py。

7
我同时以不同进程运行相同的Python程序,它们都想使用h5py Python包写入同一个hdf5文件。但是,在写模式下只能有一个进程打开给定的hdf5文件,否则会出现以下错误:
OSError: Unable to open file (unable to lock file, errno = 11, error message = 'Resource temporarily unavailable') During handling of the above exception, another exception occurred: OSError: Unable to create file (unable to open file: name = 'test.hdf5', errno = 17, error message = 'File exists', flags = 15, o_flags = c2)
我想通过检查文件是否已在写模式下打开来解决这个问题,如果是,则等待一段时间并再次检查,直到它不再以写模式打开。我没有发现任何h5py或hdf5的此类检查功能。目前,我的解决方案基于以下内容:
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功能。http://docs.h5py.org/en/latest/mpi.html#using-parallel-hdf5-from-h5py如果您无法使用这些功能或不想使用它们,为什么不使用单个进程读取/写入HDF5文件呢?通常,单线程I/O并不是真正的瓶颈。例如,正确使用块缓存/最小化API调用更加重要。 - max9111
我的问题不是性能问题。我只是有多个进程(原则上彼此无关)试图同时写入同一个文件。让这些进程等待,直到没有其他进程以写模式打开该文件,然后再尝试打开文件本身并不是问题。 - jmd_dk
1个回答

2
根据快速研究,没有平台无关的方法来检查文件是否已经以写模式打开。 如何在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 repo时,常常会看到.lock文件散落四处...

唯一的问题是,PyTables 似乎不能很好地清理自己,导致许多文件以不可预测的方式保持打开状态。 - derchambers

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