没有真正内存不足的Python MemoryError?

时间:2016-06-06 18:51:27

标签: python image numpy memory

我正在尝试对一堆图像(> 40k)执行平均缩放。当我读入大小为(3,256,256)的图像到np阵列时,内存使用率为%40(60 GB中,使用htop检查)。但是,当我运行arr.std()时,程序崩溃并给出一个MemoryError,即使使用率仍为%40。

对可能出现的问题有什么看法?

1 个答案:

答案 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 表示只有数组元素消耗的内存量,没有一些辅助字节用于阵列维护。