2012-08-02 88 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