多处理池的Gzip问题

时间:2013-06-10 02:07:15

标签: python gzip multiprocessing

我有一个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()

1 个答案:

答案 0 :(得分:0)

请参阅http://docs.python.org/2/library/multiprocessing.html#programming-guidelines

  • 您应该使用“if name == main ...”来保护呼叫部分。或者那部分将由子进程运行。
  • 明确地将资源传递给子进程。 (ohandle,lock)

我将您的代码修改为不使用锁定而不是共享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()