字典变量的MemoryError

时间:2012-05-13 17:03:37

标签: python python-2.7

我的代码在第3轮nfind(while循环)中执行有什么问题,返回MemoryError与CACHE[sha] = number一致? 在系统上有足够的内存,在while循环的每一端我清除已分配的内存,但它在第3次运行中通过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

3 个答案:

答案 0 :(得分:3)

除了Ned关于在你甚至不使用的字典中存储方式过多的答案之外,你是否有可能在32位python解释器上运行并在主进程中达到4GB内存限制? / p>

$ 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

之间

答案 1 :(得分:1)

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

您需要提出不同的算法。

此外,您似乎无法访问CACHE,那么为什么要使用它呢?

答案 2 :(得分:0)

请记住,运行del CACHE只会将内存区域标记为可用 - 它实际上并不释放它。这是垃圾收集器的工作来释放内存。尝试在循环结束时运行gc.collect()

(披露:我无法复制您的问题所以我不知道这会解决任何问题)