Python内存错误当不是真的内存不足



我正在尝试对一组图像(>40k)执行平均缩放。当我将大小为(3256256)的图像读入np阵列时,内存使用率为%40(使用htop检查60 GB中的内存)。然而,当我运行arr.std()时,程序崩溃并给出MemoryError,尽管使用率仍为%40。

有什么想法吗?

您是否完全确定数组中的每个单元格只占用1个字节,因为在默认情况下,它可能为每个单元格分配8个字节。

我创建了一个3 x 3的小数组,它占用了72个字节。

import numpy as np a = np.array(np.mat('1, 2, 3; 4, 5, 6; 7, 8, 9')) print(a.nbytes) # Use this .nbytes instead of sys.getsizeof

256 x 256 x 3 x 8字节=1572864 B=1.5 MB

1.5 MB x 40000=60000 MB \约58.6 GB

你说你至少有4万个,所以如果你有更多的,std正在使用一些内存来压平数组(参见http://docs.scipy.org/doc/numpy-1.9.2/reference/generated/numpy.std.html你会在这里降落https://github.com/numpy/numpy/blob/master/numpy/core/_methods.py)你的记忆力会耗尽的。

解决方案非常简单:从这里强制执行字节类型int8或其他类型:http://docs.scipy.org/doc/numpy-1.9.2/user/basics.types.html

a = np.array(np.mat('1, 2, 3, ; 4, 5, 6; 7, 8, 9'), dtype=np.int8) print(a.nbytes) # Only 9 Bytes


要检查可用内存,请尝试Python方式(而不是htop):

import psutil m = psutil.virtual_memory() print(m.available)


p.S.请记住,array.nbytes仅显示阵列元素所消耗的内存量,而没有一些辅助字节用于阵列维护。

最新更新