我正在编写一个程序来读取多个文件,并将每个文件的摘要写入输出文件。输出文件的大小相当大,因此将其保存在内存中并不是一个好主意。我正在尝试开发一种多处理方式。到目前为止,我能够提供的最简单的方法是:
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个开始计算?
有更好的方法吗?
感谢。
答案 0 :(得分:4)
processes=4
表示多处理将启动具有四个工作进程的池并将工作项发送给它们。理想情况下,如果您的系统支持它,即您有四个内核,或者工作者不完全受CPU限制,则将并行处理4个工作项。
我不知道多处理的实现,但我认为do
的结果甚至会在你读出之前在内部进行缓存,即第5项将在任何进程完成之后计算出来。来自第一波的项目。
如果有更好的方法取决于您的数据类型。总共有多少文件需要处理,summary
对象有多大等等。如果你有很多文件(例如,超过10k),可以选择批量文件,通过
it = pool.imap_unordered(do, glob.iglob(aglob), chunksize=100)
这样,工作项不是一个文件,而是100个文件,结果也以100个批量报告。如果你有很多工作项,那么分块会降低酸洗和取消结果对象的开销。