2012-05-13 71 views
1

什麼是錯我的代碼,在第3輪nfind(while循環)的executinon,符合CACHE[sha] = number返回的MemoryError? 在系統上有足夠的內存,並且在while循環的每一端都清除了分配的內存,但是它在通過while循環的第3次運行中返回錯誤。 如果您運行這些代碼,在某些情況下,我想有必要將XRAN= 2**23更改爲更大或更小的指數(通過一個或兩個),以產生錯誤。 請幫助和建議。的MemoryError在字典可變

from multiprocessing import Pool 
from hashlib import sha256 
from struct import pack 
import gc 

XRAN= 2**23 

def compsha(number): 
    return number, sha256(pack("Q", number)).digest() 

if __name__ == '__main__': 
    gc.enable() 
    nfind = 1 
    while (nfind > 0): 
     print(nfind) 
     CACHE = {} 
     pool = Pool() 
     for i, output in enumerate(pool.imap_unordered(compsha, xrange((nfind-1)*XRAN, nfind*XRAN), 2)): 
      number, sha = output 
      CACHE[sha] = number 
     pool.close() 
     pool.join() 
     if nfind != 0 : 
      nfind = nfind + 1 
     del CACHE 
======================================================= 
>>> 
1 
2 

Traceback (most recent call last): 
    File "D:\Python27\free_pool.py", line 20, in <module> 
    CACHE[sha] = number 
MemoryError 

回答

1

你運行內存,因爲你想存儲在一個字典2**23元素。這使用了大量的記憶,顯然比你更多!你說你有足夠的RAM,你是如何確定你需要多少?

你需要想出一個不同的算法。

而且,你似乎沒有以往任何時候都訪問CACHE,那你爲什麼使用它呢?

+0

但在環路上每一個使用'德爾CACHE'我的可用內存。此外,我還使用System Explorer監視內存分配,並在每個循環結束時釋放它。有足夠的內存。在本例中代碼爲'CACHE',因爲這部分對本次展覽不重要。 – user1391182

+0

是的,每次循環後內存都被釋放。這將是一個循環內的內存限制。 – jdi

+0

@ user1391182:你能解釋爲什麼你認爲自己有足夠的記憶嗎?顯然你沒有。 –

3

除了Ned關於在甚至沒有使用的字典中存儲太多方式的回答之外,是否有可能您正在運行32位Python解釋器並在主進程中觸及4GB內存限制?

$ python -c "import sys; print sys.maxint" // 64-bit python 
9223372036854775807 

$ python-32 -c "import sys; print sys.maxint" // 32-bit 
2147483647 

在Windows上,32位進程可能2-4GB

+0

我會說閱讀所有評論,這是正確的答案。 OP似乎在說即使計算機有4GB內存,該程序也會在大約2GB的內存使用情況下爆發。我認爲2GB是Windows最可能的限制。 –

0

之間的限制請運行del CACHE心中只有標誌着該區域的內存作爲freeable - 它實際上並沒有釋放它。這是垃圾收集器的工作來釋放內存。嘗試在循環結束時運行gc.collect()

(披露:我不能複製你的問題,所以我不知道,這將解決任何東西)

+1

我不認爲這是正確的。引用計數的優點是,當一個對象的引用計數下降到零時,它可以立即回收。 GC用於回收循環結構。 –

+0

@haldean:關於複製,嘗試將'XRAN = 2 ** 23'更改爲更大的指數,例如24,25或26.並且在一點上(但不是在第一個「while」過程中),它會產生錯誤。 – user1391182

+0

@NedBatchelder啊你當然是對的。忽視這一點。 –