仅在文件不存在时安全地序列化文件 - 避免竞争条件
我在同时保存很多没有列名的csv文件,这样我就可以用cat
命令在unix系统中快速把它们合并在一起。这些csv文件有1000多列,所以我想保存一份列名的副本,以便在重新合并时使用。不过,因为我是在并行创建这些文件,所以我希望只有第一个任务能把pandas的索引对象保存下来。
通常,为了避免在写文件时出现竞争条件,我会使用os.open()
。根据这个问题的说法。不过,我尝试在保存时把这个方法结合起来:
cPickle.dump( df.columns, os.open( "/dir/my_columns.pkl", os.O_WRONLY|os.O_CREAT|os.O_EXCL ),-1 )
但是,pickle.dump
的第二个参数需要一个可以写入的对象,而os.open()
返回的对象并没有这个属性。如果多个线程同时想创建这个对象,有没有其他方法可以安全地保存这个对象呢?
1 个回答
0
你可以使用 os.open
来创建一个新文件,之后用 os.close
关闭它,然后再用 open
重新打开这个文件:
import os
import cPickle
fileName = "/dir/my_columns.pkl"
try:
# Ensure that only one thread continues beyond this point
os.close(os.open( fileName, os.O_CREAT|os.O_EXCL ))
except OSError:
raise RuntimeError(fileName + " could not be created.")
with open(fileName, 'w') as f:
cPickle.dump( df.columns, f, -1 )