199

我正在使用 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 数组。有任何想法吗?

4

3 回答 3

302

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

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
于 2012-08-02T19:24:14.747 回答
19

字段nbytes将为您提供 a 中数组所有元素的大小(以字节为单位)numpy.array

size_in_bytes = my_numpy_array.nbytes

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

于 2018-03-07T02:03:09.593 回答
3

在 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)))
于 2019-09-09T11:58:40.647 回答