我正在尝试对一堆图像(> 40k)执行平均缩放。当我读入大小为(3,256,256)的图像到np阵列时,内存使用率为%40(60 GB中,使用htop检查)。但是,当我运行arr.std()时,程序崩溃并给出一个MemoryError,即使使用率仍为%40。
对可能出现的问题有什么看法?
答案 0 :(得分:1)
您是否完全确定数组的每个单元格只需要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×256×3×8字节= 1572864 B = 1.5MB
1.5 MB x 40,000 = 60000 MB \约58.6 GB
而且你说你至少有40万,所以如果你有更多,那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
检查可用内存尝试pythonic方式(而不是htop):
import psutil
m = psutil.virtual_memory()
print(m.available)
P.S。请记住, array.nbytes 表示只有数组元素消耗的内存量,没有一些辅助字节用于阵列维护。