2012-08-02 43 views
84

我使用python來分析一些大文件,並且遇到了內存問題,所以我一直在使用sys.getsizeof()來嘗試跟蹤使用情況,但它是numpy數組的行爲是奇怪的。這裏涉及圖,我有開反照率的一個例子:numpy數組的Python內存使用

>>> 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數組。有任何想法嗎?

+4

從上'sys.getsizeof'文檔: 「以字節爲單位返回對象的大小,對象可以是任何類型的對象,所有內置對象都會返回正確的結果,但這不一定適用於第三方擴展,因爲它是特定於實現的。只有內存消耗直接歸因於該對象是被考慮的,而不是它所指的對象的內存消耗。「 – 2012-08-02 19:24:16

+0

這使'getsizeof'成爲內存消耗的不可靠指標,特別是對於第三方擴展。 – 2012-08-02 19:25:15

+7

基本上,這裏的問題是'resize'正在返回一個'view',而不是一個新的數組。你得到的是視圖的大小,而不是實際的數據。 – mgilson 2012-08-02 19:26:39

回答

125

可以使用array.nbytes爲numpy的陣列,例如:

>>> 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 2012-08-02 19:48:35

+0

它的sys.getsizeof(a),在導入sys之後。 – eddys 2018-02-01 10:52:43

0

下工作,而無需創建一個新的數組:

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