3

nfind(while ループ) の 3 番目のラウンドで実行され、次のように MemoryError が返されるコードの何が問題になっていますCACHE[sha] = numberか? システムには十分なメモリがあり、while ループの最後で割り当てられたメモリをクリアしますが、whileループの 3 回目の実行でエラーが返されます。これらのコードを実行すると、場合によっては、XRAN= 2**23エラーを生成するために指数を大きくするか小さくする必要があると思います (1 つか 2 つ)。ヘルプと提案をお願いします。

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 ~ 4 GB に制限される場合があります。

于 2012-05-13T17:23:03.463 に答える
1

2**23要素をディクショナリに格納しようとしているため、メモリが不足しています。それは明らかにあなたが持っているよりも多くのメモリを使用します! あなたは十分な RAM を持っていると言っていますが、どのくらい必要かをどのように判断しましたか?

別のアルゴリズムを考え出す必要があります。

また、あなたは CACHE にアクセスしたことがないようですが、なぜ CACHE を使用しているのですか?

于 2012-05-13T17:07:29.253 に答える
0

実行del CACHEすると、メモリのその領域が解放可能としてマークされるだけであることに注意してください。実際に解放されるわけではありません。来て、そのメモリを解放するのは、ガベージ コレクターの仕事です。gc.collect()ループの最後で 実行してみてください。

(開示:あなたの問題を再現することはできないので、これで何かが修正されるかどうかはわかりません)

于 2012-05-13T18:32:37.033 に答える