我正在使用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)))

其他回答

字段nbytes将给出numpy.array中所有数组元素的字节大小:

size_in_bytes = my_numpy_array.nbytes

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

你可以使用数组。用于numpy数组的Nbytes,例如:

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

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