Python中的multiprocessing imap_unordered
我正在制作一个程序,这个程序可以读取多个文件,并把每个文件的总结写到一个输出文件里。由于输出文件的大小比较大,所以把它全部放在内存里并不是个好主意。我想开发一种多进程的方法来实现这个功能。目前我想到的最简单的方法是:
pool = Pool(processes=4)
it = pool.imap_unordered(do, glob.iglob(aglob))
for summary in it:
writer.writerows(summary)
这里的do是用来总结文件的函数,writer是一个csv.writer对象。
不过老实说,我对multiprocessing.imap还不是很理解。这个意思是说4个总结是同时计算的,当我读取其中一个时,第5个就开始计算了吗?
有没有更好的方法来实现这个呢?
谢谢。
1 个回答
4
processes=4
的意思是说,程序会启动一个包含四个工作进程的池子,然后把工作任务分配给这些进程。理想情况下,如果你的系统支持,比如你有四个处理器核心,或者这些工作进程并不是完全占用CPU,那么就可以同时处理四个任务。
我对多进程的具体实现不是很了解,但我觉得在你取出结果之前,do
的结果会在内部被缓存,也就是说,第五个任务会在任何一个进程完成第一个任务后就开始计算。
是否有更好的方法取决于你的数据类型。比如说,你需要处理的文件总共有多少,summary
对象有多大等等。如果你有很多文件(比如超过一万),可以考虑把它们分批处理,像这样:
it = pool.imap_unordered(do, glob.iglob(aglob), chunksize=100)
这样的话,一个工作任务就不是一个文件,而是100个文件,结果也会以100个为一批来报告。如果你的工作任务很多,分块处理可以减少序列化和反序列化结果对象的开销。