pythonを使用していくつかの大きなファイルを分析していて、メモリの問題が発生しているため、sys.getsizeof()を使用して使用状況を追跡してきましたが、配列の数が多い場合の動作は奇妙です。これは、私が開かなければならないアルベドのマップを含む例です:
>>> 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バイトになりました。私の記憶の問題が終わってすべてを単純な配列に変換することを願っていますが、この動作は、trueの場合、情報理論や熱力学などの法則に何らかの形で違反すると思います。 getsizeof()がnumpy配列では機能しないと信じる傾向があります。何か案は?
これにより
—
Joel Cornett、2012
getsizeof
、特にサードパーティの拡張機能では、メモリ消費の信頼性の低い指標になります。
基本的に、ここでの問題は、新しい配列ではなくを
—
mgilson 2012
resize
返すことですview
。実際のデータではなく、ビューのサイズを取得しています。
そのため
—
エリック
sys.getsizeof(albedo.base)
、非表示のサイズを与えます。
sys.getsizeof
:「オブジェクトのサイズをバイト単位で返します。オブジェクトは任意のタイプのオブジェクトにすることができます。すべての組み込みオブジェクトは正しい結果を返しますが、これはサードパーティの拡張機能に当てはまる必要はありません。実装固有。対象となるオブジェクトのメモリ消費ではなく、オブジェクトに直接起因するメモリ消費のみが考慮されます。」