多处理p的Gzip问题

2024-09-30 01:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从多处理池写入的gzip文件句柄。不幸的是,输出文件在某一点之后似乎已损坏,因此执行类似zcat out | wc的操作会导致:

gzip: out: invalid compressed data--format violated

我通过不使用gzip来处理这个问题。但我很好奇为什么会发生这种情况,是否有任何解决办法。在

不确定这是否重要,但我在一台远程linux机器上运行代码,我不控制它,但我猜它是一台ubuntu机器。Python 2.7.3

下面是稍微简化的代码:

^{pr2}$

Tags: 文件代码机器formatdata情况out句柄
1条回答
网友
1楼 · 发布于 2024-09-30 01:24:30

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

  • 你应该用“if名称==main…”来保护调用部分。或者该部分将由子进程运行。在
  • 显式地将资源传递给子进程。(把手,锁)

我修改了你的代码,不使用锁,也不共享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()

相关问题 更多 >

    热门问题