我有一个gzip文件句柄,我正在从多处理池写入。不幸的是,输出文件似乎在某个点之后被破坏了,所以做zcat out | wc
这样的事情会给出:
gzip: out: invalid compressed data--format violated
我正在通过不使用gzip来处理这个问题。但我很好奇为什么会这样,以及是否有任何解决方案。
不确定它是否重要,但是我在远程linux机器上运行我无法控制的代码,但我的猜测是它是一台ubuntu机器。 Python 2.7.3
这是稍微简化的代码:
lock = Lock()
ohandle = gzip.open("out", "w")
def process(fn):
rv = []
for l in open(fn):
sometext = dosomething(l)
rv.append(sometext)
lock.acquire()
for sometext in rv:
print >> ohandle, sometext
lock.release()
pool = Pool(processes=4)
pm = pool.map(process, some_file_list])
ohandle.close()
答案 0 :(得分:0)
请参阅http://docs.python.org/2/library/multiprocessing.html#programming-guidelines
我将您的代码修改为不使用锁定而不是共享ohandle。 相反,我使用临时文件。 (fn +'。temp')
警告:您应该检查文件名。如果有任何带有“.temp”后缀的文件,我的代码可能会删除您的数据。
import os
def process(fn):
out_fn = fn + '.temp'
with open(fn) as f, open(out_fn, 'w') as f2:
for l in f:
sometext = dosomething(l)
print >> f2, sometext
return out_fn
if __name__ == '__main__':
some_file_list = ...
pool = Pool(processes=4)
ohandle = gzip.open('out.gz', 'w')
for fn in pool.map(process, some_file_list):
with open(fn) as f:
while True:
data = f.read(1<<12)
if not data: break
ohandle.write(data)
os.unlink(fn)
pool.close()
pool.join()