【发布时间】: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)
我想通过检查文件是否已经以写入模式打开来解决此问题,如果是,请稍等并再次检查,直到不再以写入模式打开。我还没有找到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 功能。 docs.h5py.org/en/latest/mpi.html#using-parallel-hdf5-from-h5py 如果您不能使用这些功能或不想使用它们,为什么不使用单个进程来读取/写入 HDF5 文件?通常单线程 I/O 并不是真正的瓶颈。例如,正确使用 chunk-chache/最小化 API 调用更为重要。
-
我的问题不在于性能。我只是有多个进程(原则上彼此无关)试图一次写入同一个文件。让进程等到文件没有被任何其他进程以写入模式打开后再尝试打开文件本身是没有问题的。
标签: python multiprocessing hdf5 h5py file-writing