10

Python インタープリターでクエリを実行します。

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> k = [i for i in xrange(9999999)]
>>> import sys
>>> sys.getsizeof(k)/1024/1024
38
>>>

そしてここ - RAMからどれだけかかるかを見てください:


ステートメント後のメモリ使用量del k:

そして後gc.collect()

予想されるサイズが 38Mb の整数のリストが 160Mb かかるのはなぜですか?

UPD:質 ​​問のこの部分は回答されました(ほとんどすぐに、複数回:))

わかりました-ここに別のなぞなぞがあります:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys

>>> str = 'abcdefg'
>>> sys.getsizeof(str)
28
>>> k = []
>>> for i in xrange(9999999):
...     k.append(str)
...
>>> sys.getsizeof(str)*9999999/1024/1024
267

今どれくらい消費すると思いますか?


(ソース: i.imm.io )

のサイズはstr、過去の例では 12 に対して 28 です。したがって、予想されるメモリ使用量は 267Mb で、整数の場合はさらに多くなります。しかし、わずか 40Mb しかかかりません!

4

2 に答える 2

14

sys.getsizeof()それはあなたが期待するもののほんの一部を占めることが多いので、あまり役に立ちません。この場合、それはリストを説明しますが、リストにあるすべての整数オブジェクトを説明するわけではありません。リストには、アイテムごとに約4バイトが必要です。整数オブジェクトは、それぞれさらに12バイトかかります。たとえば、これを試してみると:

k = [42] * 9999999
print sys.getsizeof(k)

リストにはアイテムごとに4バイト、つまり約40MBが必要ですが、すべてのアイテムが同じ整数オブジェクト42へのポインタであるため、合計メモリ使用量は40MBをはるかに超えません。

于 2012-12-14T16:19:45.410 に答える
2

getsizeof() とは

最初に、size-of 演算子の意味を確認することを提案します。正確な説明はドキュメントにあります。次の文を拡大したい。

オブジェクトが参照するオブジェクトのメモリ消費ではなく、オブジェクトに直接起因するメモリ消費のみが考慮されます。

これは、sys.getsizeof([a]) を要求しても、配列の実際のサイズを取得できないことを意味します。リストの管理専用のすべてのメモリのサイズのみを取得します。リストにはまだ 9999999 個の整数が含まれています。各整数は 12 バイトで構成され、合計で 114 MB になります。配列の管理専用のメモリ 32MB と、配列内のデータのメモリの合計は 146Mb であり、結果にかなり近くなります。

于 2012-12-14T16:37:51.207 に答える