Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
numpy数组的Python内存使用_Python_Numpy_Sys - Fatal编程技术网

numpy数组的Python内存使用

numpy数组的Python内存使用,python,numpy,sys,Python,Numpy,Sys,我正在使用python分析一些大文件,并且遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但它在numpy数组中的行为很奇怪。下面是一个我必须打开的反照率地图示例: >>> import numpy as np >>> import struct >>> from sys import getsizeof >>> f = open('Albedo_map.assoc', 'rb') >

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

可以用于numpy阵列,例如:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
该字段将为您提供
numpy.array中数组所有元素的大小(以字节为单位):

size_in_bytes = my_numpy_array.nbytes

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

在python笔记本中,我经常想过滤掉“悬空”numpy.ndarray,特别是存储在
\u 1
\u 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)))

sys.getsizeof
上的文档:“返回对象的大小(以字节为单位)。对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但这对于第三方扩展不一定是真的,因为它是特定于实现的。只考虑直接归因于对象的内存消耗,而不考虑它所指对象的内存消耗。“这使得
getsizeof
成为内存消耗的不可靠指标,特别是对于第三方扩展。基本上,这里的问题是
resize
返回的是
视图,而不是新数组。”。您得到的是视图的大小,而不是实际的数据。为此,
sys.getsizeof(albedo.base)
将在导入sys之后给出非视图的大小。它的sys.getsizeof(a)。
b.\uuu sizeof()相当于
sys.getsizeof(b)
round(getsizeof(a)/1024/1024,2)
要获得mb,这个答案仍然会创建一个数组,因此我认为您的意思是“无需从列表转换为数组”。虽然GWW的答案确实是先创建一个列表,然后将其转换为一个数组,但这并不重要,因为OP已经有了一个数组。。。关键是如何获得numpy数组的大小,因此如何获得数组并不重要。同样,你也可以批评这个答案,说它改变了现有的数组。Hello@Moot,谢谢你的评论。问题是如何获得数组的字节大小。虽然我的代码片段首先创建了一个数组是正确的,但它只是为了得到一个可以执行的完整示例。我将编辑我的答案来强调这一点。