2011-06-10 27 views
6

我正在制作一个程序,它读取多个文件并将每个文件的摘要写入输出文件。输出文件的大小相当大,因此将它保存在内存中不是一个好主意。我正在尝试开发一种多处理方式。到目前为止,我能够使用的最简单的方法是:多处理imap_unordered在python

pool = Pool(processes=4) 
it = pool.imap_unordered(do, glob.iglob(aglob)) 
for summary in it: 
    writer.writerows(summary) 

do是汇总文件的函数。作家是一个csv.writer对象

但事实是,我仍然不明白multiprocessing.imap完全。这是否意味着4个摘要是并行计算的,并且当我读取其中的一个时,第5个开始计算?

有没有更好的方法来做到这一点?

谢谢。

回答

4

processes=4意味着多处理将启动具有四个工作进程的池并将工作项发送给它们。理想情况下,如果您的系统支持它,即您有四个核心,或者工作人员并非完全受CPU限制,则4个工作项目将并行处理。

我不知道多处理的实现,但我认为do的结果会在你读出它们之前在内部被缓存,也就是说,一旦任何处理完成了第一波。

如果有更好的方法取决于您的数据类型。多少个文件中有需要处理的总,多大summary对象等,如果你有很多的文件(比如说,超过10K),配料他们可能是一种选择,通过

it = pool.imap_unordered(do, glob.iglob(aglob), chunksize=100) 

这样,一个工作项目不是一个文件,而是100个文件,并且结果也以100个批次报告。如果您有许多工作项目,分块会降低酸洗和取消结果对象的开销。 “

+1

”组块可降低酸洗和取消结果对象的开销。“ - 那么为什么不做'chunksize = len(iterable)/进程数量?什么是折衷? – 2012-08-24 16:34:30

+1

@AdamParkin每个项目可能不会被处理器以相同的速度处理,您希望有一堆“准备好分派”项目来填充等待中的处理器。 – Zenon 2012-10-18 03:38:51

+0

嗯,我想你应该有'max(3 * nproc,len(it))'作业,然后。意思是'chunksize = len(it)/ max(3 * nproc,len(it))'。还是有很好的启发式? – 2015-10-23 11:15:49