我试图并行化文件过滤操作,其中每个过滤器都是一个很大的正则表达式,所以整个过程需要时间来运行。该文件本身约为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
' imap
但是ValueError: I/O operation on closed file.
我认为迭代器正在复制到每个进程,但并非所有进程都处理打开。< / p>
有没有办法使用multiprocessing
执行此操作,最好是使用池?
答案 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_sr
和out_sr
。
with