3

我在第三轮(while 循环)中执行的代码有什么问题nfind,返回 MemoryError 符合CACHE[sha] = number?在系统上有足够的内存,并且在 while 循环的每一端我清除分配的内存,但它在第三次while循环中返回错误。如果您运行这些代码,在某些情况下,我认为有必要更改XRAN= 2**23为更大或更小的指数(一或二),以产生错误。请帮助和建议。

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
4

3 回答 3

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 之间

于 2012-05-13T17:23:03.463 回答
1

您的内存不足是因为您试图将2**23元素存储在字典中。这使用了大量的内存,显然比你拥有的更多!你说你有足够的内存,你是如何确定你需要多少内存的?

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

此外,您似乎从未访问过 CACHE,那么您为什么要使用它呢?

于 2012-05-13T17:07:29.253 回答
0

Keep in mind running del CACHE only marks that area of memory as freeable -- it doesn't actually free it. It's the garbage collector's job to come and free up that memory. Try running gc.collect() at the end of your loop.

(Disclosure: I can't replicate your problem so I don't know that this will fix anything)

于 2012-05-13T18:32:37.033 回答