问题描述
|
我正在编写一个程序,该程序可以读取多个文件,并将每个文件的摘要写入输出文件。输出文件的大小很大,因此将其保存在内存中并不是一个好主意。我正在尝试开发一种多处理方式。到目前为止,最简单的方法是:
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”表示多处理将启动具有四个工作进程的池,并将工作项发送给它们。理想情况下,如果您的系统支持它,即您有四个内核,或者工作程序不完全受CPU限制,则将并行处理4个工作项。
我不知道多处理的实现方式,但是我认为即使在您读出ѭ2the的结果之前,它们也将在内部缓存,即,一旦对第一波中的某项进行了任何处理,就将计算出第五项。
是否有更好的方法取决于您的数据类型。总共需要处理多少个文件,“ 3”个对象的大小等等。如果您有许多文件(例如,超过10k),则可以通过以下方式进行批处理
it = pool.imap_unordered(do,glob.iglob(aglob),chunksize=100)
这样,一个工作项不是一个文件,而是100个文件,并且结果也将按100个批处理报告。如果您有许多工作项,则分块可降低酸洗和取消酸洗结果对象的开销。