Python MemoryError 何时不是真的内存不足?

标签 python image numpy memory

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

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

最佳答案

您完全确定数组的每个单元仅占用 1 个字节吗?因为默认情况下它可能会为单元分配 8 个字节。

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

将 numpy 导入为 np a = np.array(np.mat('1, 2, 3; 4, 5, 6; 7, 8, 9')) print(a.nbytes) # 使用这个.nbytes代替sys.getsizeof

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

1.5 MB x 40,000 = 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) # 只有 9 个字节

<小时/>

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

导入 psutil m = psutil.virtual_memory() 打印(m.可用)

<小时/>

附注请记住,array.nbytes 显示仅由数组元素消耗的内存量,没有一些用于数组维护的辅助字节。

关于Python MemoryError 何时不是真的内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37664829/

相关文章:

image - stackoverflow 深色主题并显示用户 Logo

python - 当项目集等于 fill_value 时自动屏蔽 np.ma 数组

python - 使用 h5py 读取 HDF5 文件时使用 python 切片对象?

python - Numpy:1:多操作上下文中的向量化

python - 我正在尝试使用 pygame 和 event.key 制作一个 2 人赛车游戏。key 不起作用

python - 使用Python 3删除数据框中多个指定列中具有空值的特定行

flash - 如何将带有动态数据的 Flash 转换为 AVI 视频

python - PyCuda mem_alloc 初始化错误

python - 具有不规则采样率的傅里叶变换

javascript - 调整背景图像大小的替代方法