我使用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