我正在使用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数组一起工作。什么好主意吗?
在python笔记本中,我经常想过滤掉“悬空的”numpy。Ndarray的,特别是那些存储在_1,_2等中的,本来就不可能存活的。
我使用这段代码来获得所有它们及其大小的列表。
不确定locals()或globals()在这里更好。
import sys
import numpy
from humanize import naturalsize
for size, name in sorted(
(value.nbytes, name)
for name, value in locals().items()
if isinstance(value, numpy.ndarray)):
print("{:>30}: {:>8}".format(name, naturalsize(size)))
在python笔记本中,我经常想过滤掉“悬空的”numpy。Ndarray的,特别是那些存储在_1,_2等中的,本来就不可能存活的。
我使用这段代码来获得所有它们及其大小的列表。
不确定locals()或globals()在这里更好。
import sys
import numpy
from humanize import naturalsize
for size, name in sorted(
(value.nbytes, name)
for name, value in locals().items()
if isinstance(value, numpy.ndarray)):
print("{:>30}: {:>8}".format(name, naturalsize(size)))