我正在使用python分析一些大文件,并且遇到了内存问题,因此我一直在使用sys.getsizeof()来跟踪使用情况,但是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像素图)已从约200 Mb变为80字节。我希望我的内存问题已经解决,并将所有内容都转换为numpy数组,但是我认为这种行为(如果为真)在某种程度上会违反某些信息论定律或热力学定律,等等。倾向于相信getsizeof()不适用于numpy数组。有任何想法吗?
这
—
乔尔·科内特
getsizeof
不能可靠地指示内存消耗,尤其是对于第三方扩展而言。
基本上,这里的问题
—
mgilson 2012年
resize
是返回一个view
,而不是一个新的数组。您正在获取视图的大小,而不是实际数据。
为此,
—
埃里克
sys.getsizeof(albedo.base)
将给出非视图的大小。
sys.getsizeof
:“返回对象的大小(以字节为单位。该对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但是对于第三方扩展而言,这不必成立)具体实现方式。仅考虑直接归因于该对象的内存消耗,而不考虑它所引用的对象的内存消耗。”