我正在将许多图像加载到内存中,因为在训练神经网络时,我需要经常对其进行迭代以执行随机数据增强。我的机器有64GB的内存,可用空间超过60GB。该机器运行64位Linux和Python 3.7.4。
我的脚本一直运行到进程超过16GB为止。然后我看到此错误消息:
cv2.error:OpenCV(3.4.2)/tmp/build/80754af9/opencv-suite_1535558553474/work/modules/core/src/alloc.cpp:55:错误:(-4:内存不足)无法分配18874368字节 [这是18MB] 函数'OutOfMemoryError'
cv2和/或python是否有内部内存限制?
我也用numpy尝试了以下方法:
a = np.zeros((16*1024*1024*1024,), dtype=np.uint8)+1
(工作并分配16GB)
a = np.zeros((17*1024*1024*1024,), dtype=np.uint8)+1
(崩溃)
所以我认为这是python或numpy问题,因为cv2内部使用了numpy。
有趣的是,我可以使用pytorch分配> 16GB:
a = torch.ones((28*1024*1024*1024,), dtype=torch.uint8)
(可以,但是当我尝试超过28GB时失败)
忘了提到我正在SLURM实例中运行所有内容。但是我不知道如何找出问题所在,因为我没有其他机器拥有如此大的内存。
编辑:加载每个图像之前,我使用psutil打印内存信息。这是在崩溃之前的提示:
svmem(总计= 134773501952,可用= 116365168640,百分比= 13.7,已使用= 17686675456,空闲= 112370987008,活动= 18417344512,不活动= 2524413952,缓冲区= 176410624,缓存= 4539428864,共享= 87986176,slab = 371335168) / p>
答案 0 :(得分:1)
该问题与Python和/或OpenCV无关。我的ulimit -v
设置太低。运行ulimit -v unlimited
可解决问题。