2010-06-08 80 views
0

我想用多線程來加快我的腳本速度...... 我對這個還是很陌生的。 Python文檔假定您已經瞭解線程和不瞭解什麼。mutliprocessing.Pool.add_sync()吃掉內存

所以......

我的代碼看起來像這樣

from itertools import izip 
from multiprocessing import Pool 

p = Pool() 
for i, j in izip(hugeseta, hugesetb): 
    p.apply_async(number_crunching, (i, j)) 

這給了我很大的速度!

然而,hugesetahugesetb真正巨大。在他們完成工作後(基本上,將輸出打印到標準輸出),池將內存中的所有內存保留在內存中。是否有任何刪除,和j他們完成後?

回答

0

不是一個真正的答案,但我用Pool.imap()代替:

for i in p.imap(do, izip(Fastitr(seqsa, filetype='fastq'), \ 
     Fastitr(seqsb, filetype='fastq'))): 
    pass 

其中精美的作品和垃圾收集但是預期感覺好笑具有for循環一無所有,但實際上pass做些有用的事情。

0

del statement刪除對象引用,因此可以在垃圾收集器運行時釋放內存。

from itertools import izip 
from multiprocessing import Pool 

p = Pool() 
for i, j in izip(hugeseta, hugesetb): 
    p.apply_async(number_crunching, (i, j)) 

del i, j 
+0

我會在哪裏放del? 我試着檢查池中的死亡工人,但從來沒有比核心更多的工人。 那麼存儲的所有_i_和_j_s在哪裏? – 2010-06-08 21:40:50

+0

@奧斯汀只要你和他們在一起,我就會和你一起。 – zdav 2010-06-08 22:28:03

+0

我是指循環運行時。如果我在沒有Pool的情況下運行,內存使用變平坦。如果我用Pool運行它,舊的_i_和_j_不會被垃圾收集。 – 2010-06-09 14:05:20