python使用多进程过滤大量文件

时间:2015-12-03 06:46:57

标签: python multiprocessing

我试图并行化文件过滤操作,其中每个过滤器都是一个很大的正则表达式,所以整个过程需要时间来运行。该文件本身约为100GB。单进程版本如下所示:

def func(line):
    # simple function as an example
    for i in range(10**7):
        pass
    return len(line) % 2 == 0


with open('input.txt') as in_sr, open('output.txt', 'w') as out_sr:
    for line in input:
        if func(line):
            out_sr.write(line)

我尝试使用multiprocessing&#39; imap但是ValueError: I/O operation on closed file.我认为迭代器正在复制到每个进程,但并非所有进程都处理打开。< / p>

有没有办法使用multiprocessing执行此操作,最好是使用池?

2 个答案:

答案 0 :(得分:1)

代码与此类似:

def func(line):
    ...

if __name__ == '__main__':

    from multiprocessing import Pool
    from itertools import tee, izip

    pool = Pool(processes=4)

    with open('input.txt') as in_sr, open('output.txt', 'w') as out_sr:
        lines1, lines2 = tee(in_sr)
        for line, flag in izip(lines1, pool.imap(func, lines2)):
            if flag:
                out_sr.write(line)

答案 1 :(得分:1)

我可以毫无错误地运行以下代码。确保您没有在data[i_low:i_high]声明之外致电in_srout_sr

with