3

Windows 7 64 ビットおよび Python 2.7 32 ビットを使用して、Python コンソールで次の出力を取得しました。

>>> a = {}
>>> for k in xrange(1000000): a[k] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>> len(a)
21846
>>> a[21846]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 21846
>>> a[21846] = 21846
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

dict に 21846 個を超えるアイテムを追加できないのはなぜですか?

この数値 (2 * 3 * 11 * 331) の具体的な内容は?

注: 私は sys.getsizeof(a) == 393356 よりも多くの RAM を持っています

4

3 に答える 3

8

非常に驚くべき!21846 について Python に特別なことは何もありません。これは、Python 2.7.5 と適度な 3 GB の RAM を搭載した 32 ビット Windows Vista です。

>>> a = {}
>>> for k in xrange(1000000): a[k] = k
...
>>> len(a)
1000000

1000万でもできる。しかし、これは新しいコンソール ウィンドウから始まりました。おそらく、あなたが私たちに示す前に他のことをして、いくつかの大きなデータ構造を残しましたか? 21846 は現代の基準では小さいです ;-)

後で

これは、Python のバグ トラッカー ( http://bugs.python.org/issue19246 ) に投稿されました。

これは、単純な小さな純粋な C プログラムで同様の動作が再現されたため、「修正しない」としてクローズされました。つまり、システム Cmalloc()とシステムfree()に問題があり、Python がそれについてできることは何もありません。Microsoft の C ライブラリを使用しており、Windows に固有のもののようです。問題はヒープの断片化です。さまざまなサイズの多くのオブジェクトを割り当てて解放した後malloc()、「大きな」メモリ ブロックを要求されたときにシステムは失敗します。利用可能な空きバイトがたくさんあるにもかかわらずです。しかし、それらは単一の連続したチャンクではありません (少なくとも、システムmalloc()がそのように認識するものではありません)。

何かが起こる;-)

于 2013-10-10T04:43:44.133 に答える