我使用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數組。有任何想法嗎?
從上'sys.getsizeof'文檔: 「以字節爲單位返回對象的大小,對象可以是任何類型的對象,所有內置對象都會返回正確的結果,但這不一定適用於第三方擴展,因爲它是特定於實現的。只有內存消耗直接歸因於該對象是被考慮的,而不是它所指的對象的內存消耗。「 – 2012-08-02 19:24:16
這使'getsizeof'成爲內存消耗的不可靠指標,特別是對於第三方擴展。 – 2012-08-02 19:25:15
基本上,這裏的問題是'resize'正在返回一個'view',而不是一個新的數組。你得到的是視圖的大小,而不是實際的數據。 – mgilson 2012-08-02 19:26:39