web-dev-qa-db-ja.com

Python numpy配列のメモリ使用量

私はpythonを使用していくつかの大きなファイルを分析し、メモリの問題に直面しているため、sys.getsizeof()を使用して使用状況を追跡しようとしましたが、numpyでの動作です配列は奇妙です。以下は、私が開かなければならないアルベドのマップを含む例です。

>>> import numpy as np
>>> import struct
>>> from sys import getsizeof
>>> f = open('Albedo_map.assoc', 'rb')
>>> getsizeof(f)
144
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4))
>>> getsizeof(albedo)
207360056
>>> albedo = np.array(albedo).reshape(3600,7200)
>>> getsizeof(albedo)
80

データはまだありますが、オブジェクトのサイズ(3600x7200ピクセルマップ)が200 Mbから80バイトになりました。私は私の記憶の問題が終わって、すべてをnumpy配列に変換することを願っていますが、この行動が真実であれば、何らかの方法で情報理論や熱力学の何らかの法則に違反すると思うので、 getsizeof()はnumpy配列では機能しないと信じる傾向があります。何か案は?

132
EddyTheB

Numpy配列にはarray.nbytesを使用できます。次に例を示します。

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
198
GWW

フィールド nbytes は、numpy.arrayの配列のすべての要素のサイズをバイト単位で示します。

size_in_bytes = my_numpy_array.nbytes

これは「配列オブジェクトの非要素属性」を測定しないため、バイト単位の実際のサイズはこれよりも数バイト大きくなる可能性があることに注意してください。

4
El Marce