2013-07-03 13 views
1

我一段代碼縮小到以下最低(工作?)例如:python的多處理會泄漏內存嗎?

import multiprocessing 

def f(x): return x**2 

for n in xrange(2000): 
    P = multiprocessing.Pool() 
    sol = list(P.imap(f, range(20))) 

當我在我的電腦上運行此(Ubuntu的12.04,8核),蟒蛇進入到消耗所有可用內存,並最終由於交換無響應而掛起系統。我聽說Python在完成之前不會釋放內存,但我認爲這個程序應該消耗超過8Gb的RAM有點愚蠢。如果我想一遍又一遍地創建multiprocessing.Pool對象,那麼如何在不重新分配新內存的情況下這樣做?

+3

您正試圖啓動2000個進程池,每個進程池有8個工作者。 這就是16k個流程......對所有資源耗盡並不感到驚訝。 –

+2

另外,Python使用引用計數和垃圾回收來處理內存......絕對不是:「直到完成才釋放內存」 –

+0

我有點驚訝於內存是問題而不是其他一些資源,因爲linux CoW分叉,所以一個forkbomb可以在調度器或其他內核資源淹沒之前淹沒... – abarnert

回答

5

您正在每個循環迭代中創建一個新的多處理池 - 您是否只想要一個池來處理您的處理作業?

import multiprocessing 

def f(x): return x**2 

P = multiprocessing.Pool() 
for n in xrange(2000): 
    sol = list(P.imap(f, range(20))) 
+2

還注意到,如果沒有給出顯式數量的進程,multiprocessing.Pool()將創建一個大小爲「cpu_count」的池。 –