我有以下代码尝试将pandas数据帧附加到HDF5商店。我尝试获取独占文件锁,以便多个进程/线程/作业不会立即写入HDF5文件:
#--------------------------------------------- MODULE IMPORT ----------------------------------------------------------#
import os
import time
from pandas import HDFStore
#--------------------------------------------- DEVELOPMENT CODE -------------------------------------------------------#
class SafeHDF5Store(HDFStore):
"""Implement safe HDFStore by obtaining file lock. Multiple writes will queue if lock is not obtained."""
def __init__(self, *args, **kwargs):
"""Initialize and obtain file lock."""
interval = kwargs.pop('probe_interval', 1)
self._lock = "%s.lock" % args[0]
while True:
try:
self._flock = os.open(self._lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
break
except IOError:
time.sleep(interval)
HDFStore.__init__(self, *args, **kwargs)
def __exit__(self, *args, **kwargs):
"""Exit and remove file lock."""
HDFStore.__exit__(self, *args, **kwargs)
os.close(self._flock)
os.remove(self._lock)
def write_hdf(f, key, df, complib):
"""Append pandas dataframe to hdf5.
Args:
f -- File path
key -- Store key
df -- Pandas dataframe
complib -- Compress lib
NOTE: We use maximum compression w/ zlib.
"""
with SafeHDF5Store(f, complevel=9, complib=complib) as store:
df.to_hdf(store, key, format='table', append=True)
接下来,我在计算服务器场上启动100个作业。他们做一些计算来生成数据帧。然后他们尝试将他们的数据框附加到此表。但是,在尝试获取我不知道如何解决的锁时,我收到以下错误。有什么建议吗?
File "/safehdf5.py", line 27, in __init__
self._flock = os.open(self._lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
OSError: [Errno 17] File exists: 'osd.hdf5.lock'
当另一个进程尝试创建锁文件时,锁文件似乎已经存在(而持有锁的进程尚未完成删除该文件)。我在 exit()函数中有一个 os.remove()调用来删除该文件。
答案 0 :(得分:2)
在第29行的bootstrap.properties
内,只有__init___()
才能获得锁定:
IOError
但是,如果该文件已经存在,则会得到while True:
try:
self._flock = os.open(self._lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
break
except IOError:
time.sleep(interval)
。
因此,除了两种类型的错误并继续尝试,直到你成功:
OSError