numpy数组的Python内存使用情况

时间:2012-08-02 19:19:23

标签: python numpy sys

我使用python来分析一些大文件而且我遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但是&# #39; 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数组,但我觉得这种行为,如果是真的,会在某种程度上违反信息理论或热力学的某些定律,或者其他什么,所以我和#39;我倾向于认为getsizeof()不适用于numpy数组。有什么想法吗?

3 个答案:

答案 0 :(得分:186)

您可以将array.nbytes用于numpy数组,例如:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192

答案 1 :(得分:4)

字段nbytes将为您提供numpy.array中数组所有元素的字节大小:

size_in_bytes = my_numpy_array.nbytes

请注意,这不会测量“数组对象的非元素属性”,因此实际大小(以字节为单位)可能比此大几个字节。

答案 2 :(得分:0)

在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)))