2012-08-02 26 views
84

私はpythonを使っていくつかの大きなファイルを解析しています。メモリの問題が発生していますので、sys.getsizeof()を使用して使用量を記録していますが、 numpy配列の振る舞いは奇妙です。ここで私は開くことだアルベドのマップを含む例です:Pythonメモリの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ピクセルマップは、80バイトに〜200メガビットから行ってきました。私の記憶の問題は終わり、全てを貧弱な配列に変換することを願っていますが、この行動が真実なら何らかの情報理論や熱力学の法則に違反すると思います。 getsizeof()がnumpy配列ではうまくいかないと思う傾向があります。何か案は?

+4

を:すべてのビルトインオブジェクトは正しい結果を返しますが、実装固有のサードパーティ拡張機能には当てはまりません。 メモリ消費量のみを直接そのオブジェクトに起因するものは、それが参照するオブジェクトのメモリ消費ではなく、説明されます。 –

+0

これにより、 'getsizeof'はメモリ消費の信頼できない指標になります。特に、サードパーティの拡張機能のために。 –

+7

基本的に、ここでの問題は、 'resize'が新しい配列ではなく' view'を返すことです。実際のデータではなく、ビューのサイズを取得しています。 – mgilson

答えて

125

あなたは、たとえば、numpyのアレイにarray.nbytesを使用することができます。

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

それだけです。 albedo.nbytesは期待どおり207360000を返します。ありがとう。 – EddyTheB

+0

そのsys.getsizeof(a)は、import sysを実行した後です。 – eddys

0

次の作品は、新しい配列を作成しなくても:sys.getsizeof` `上のドキュメントから

import numpy as np 
a = np.arange(81).reshape(9,9) 
a.size * a.dtype.itemsize