2011-06-10 134 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