2015-07-02 31 views
5

我使用python 2.7.10。 我讀了很多文件,將它們存儲到一個大列表中,然後嘗試調用多處理並將大列表傳遞給這些多進程,以便每個進程都可以訪問這個大列表並進行一些計算。python多處理,大數據轉化爲睡眠過程

我使用游泳池這樣的:

def read_match_wrapper(args): 
    args2 = args[0] + (args[1],) 
    read_match(*args2) 

pool = multiprocessing.Pool(processes=10) 
result=pool.map(read_match_wrapper,itertools.izip(itertools.repeat((ped_list,chr_map,combined_id_to_id,chr)),range(10))) 
pool.close() 
pool.join() 

基本上,我傳遞多個變量 'read_match' 功能。爲了使用pool.map,我寫了'read_match_wrapper'函數。我不需要這些流程的任何結果。我只是想讓他們跑步並完成。

當我的數據列表'ped_list'很小時,我可以完成整個過程。當我加載所有的數據,如10G,那麼它產生的所有多進程顯示'S',似乎根本不工作..

我不知道是否有限制你可以訪問多少數據通過池? 我真的需要幫助!謝謝!

+0

'read_match'的代碼是什麼? –

+0

你可以檢查'itertools.izip()'節是否返回正確的值?如果你的數據真的是10G,用'repeat()',它可能會變得更糟,並可能消耗太多的內存。 – Jkm

+0

是的,我認爲記憶是這裏的問題。每次產生一個進程時,內存都會被複制。而集羣無法負擔得起! – odeya

回答

3

從多道程序設計準則:

避免共享狀態

As far as possible one should try to avoid shifting large amounts of data between processes. 

你患什麼是滿管不得到排泄的典型症狀。

由池使用的Python多處理.Pipe有一些設計缺陷。它基本上在OS管道上實現了一種面向消息的協議,它更像是一個流對象。

結果是,如果通過管道發送太大的對象,它將被塞入。發送者將無法添加內容,並且接收者將無法將其消耗,因爲它會阻止等待消息的結束。

證明您的工作人員正在睡覺等待那個永遠不會到達的「胖」信息。

是否包含文件名或文件內容的ped_list?

在第二種情況下,您寧願發送文件名而不是內容。工作人員可以用一個簡單的open()來自己檢索內容。

+0

ped_list包含文件內容,它是一個大列表... – odeya

+0

我注意到這個從其他帖子,http://stackoverflow.com/questions/14124588/python-multiprocessing-shared-memory。我應該把我的ped_list變成多處理。陣列。但我不知道該怎麼做,因爲它是列表列表。多處理.Array似乎只採用非常簡單的格式 – odeya

+1

無論您使用什麼方法共享ped_list,它仍然會很慢並且受到影響如果不是*非常*很好地實施,就會陷入僵局。問題的真正解決方案仍然是建議的解決方案。不要將文件內容加載到ped_list中,只需加載文件名並讓子工作者加載文件即可。另一個問題完全一樣你的:http://stackoverflow.com/questions/27253666/python-multiprocessing-pool-got-stuck-after-long-execution/27757177#27757177 – noxdafox

0

而不是使用pool.map我寧願使用隊列。你可以產卵的過程中所需的數量和分配隊列輸入:

​​

這樣,你的隊列從一個側面,在與其他清空,同時填補。在進程啓動之前,可能需要將某些內容放入隊列中。由於隊列爲空或者引發Queue.empty異常,因此他們有可能會停止執行任何操作。