2013-07-16 26 views
1
我使用 Pool.map用於計分程序

的Python multiprocessing.Pool&存儲器

  1. 從數據源「光標」具有數百萬陣列
  2. 計算
  3. 結果保存在數據宿

結果是獨立的。

我只是想知道是否可以避免內存需求。起初 似乎每個數組都進入python,然後2和3是 繼續。無論如何,我有一個速度提高。

#data src and sink is in mongodb# 
def scoring(some_arguments): 
     ### some stuff and finally persist ### 
    collection.update({uid:_uid},{'$set':res_profile},upsert=True) 


cursor = tracking.find(timeout=False) 
score_proc_pool = Pool(options.cores)  
#finaly I use a wrapper so I have only the document as input for map 
score_proc_pool.map(scoring_wrapper,cursor,chunksize=10000) 

我做錯了什麼或者是否有更好的方法與python爲此目的?

+0

任何代碼片段一起幫助我們? – usethedeathstar

回答

1

Poolmap函數在內部將迭代器轉換爲列表,如果它沒有__len__屬性。相關代碼位於Pool.map_async,與Pool.map(和starmap)使用的代碼相同,以產生結果 - 這也是一個列表。

如果你不想先讀所有的數據到內存中,你應該使用Pool.imapPool.imap_unordered,這將產生一個迭代,因爲他們進來,將產生的結果。

+0

完美,謝謝! – Christian

+1

我只是想知道爲什麼imap和imap_ordered給我* OOM殺*和地圖不是?有沒有什麼辦法來防止這種蟒蛇。我玩chunksize但沒有成功。 – Christian

+0

呃,這聽起來很嚴肅。你必須確保的是,你可以跟上結果的消耗,讀取結果的過程應該比產生它們的過程快得多,否則塊會堆積起來。而這個高度的大塊看起來相當過分 - 這意味着等待第一個工人產生10000個結果,然後等待第100000個,等等。我已經寫了一個快速示例來展示如何處理大塊[這裏](http://pastebin.com/YStmwQB3)。我會使用10到100倍CPU數量的塊大小... – mata