首页 > 解决方案 > 错误:(-4:内存不足)无法在函数 'cv::OutOfMemoryError' 中分配 36578304 字节

问题描述

介绍

我想训练一个卷积神经网络来预测一张张贴到 r/art 的图片作为个人项目会在 Reddit 上获得多少赞。

我已经下载了 30000 张图片 -> 18648 张有效图片,并使用他们的分数和帖子 ID 为它们命名,这样相同分数的帖子就不会发生冲突(例如,0_k0un69.jpg,对代码片段只有轻微的重要性)

问题

我正在尝试创建 X(输入图片数组)和 Y(用于神经网络训练的分数数组)。大约 5.8% 的时候,我得到了标题错误:

error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-6sxsq0tp\opencv\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 36578304 bytes in function 'cv::OutOfMemoryError'

创建此错误的代码如下:

path = "pics/"
#Get all file names
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
numpics = len(files)
#Store all image arrays and image names in a list
X = []
Y = []
counter = 0
for file in files:
    #Progress bar
    sys.stdout.write('\r')
    sys.stdout.write("Reading images into DataSets:  {:.1f}%".format((100/(numpics-1)*counter)))
    sys.stdout.flush()
    counter+=1

    X.append(cv2.imread(f'{path}{file}'))
    Y.append(file.split(".")[0].split("_")[0]

对我来说很明显问题在于我要处理多少张大图片。尽管如此,我想知道是否有什么办法可以避免将我的图片变成灰度/缩小它们,或者我的代码是否只是内存泄漏或问题。如果它有帮助,我正在研究使用全局池来处理可变图像尺寸,因为这个中型帖子堆栈交换帖子建议。如果事实证明缩放不会改变全局池后的分辨率,请告诉我,因为我不知道。

尝试的解决方案

我听说从 32 位 -> 64 位会有所帮助,但我不确定我正在做的事情是什么样的。我在 Pycharm 的 Jupyter 笔记本中运行它,我检查了 Pycharm 是 64 位可执行文件。

我有一些额外的问题需要理解:

  1. 该错误消息似乎出现在 Pycharm 或类似的 Java 虚拟机上,因为 appveyor 不是我 PC 上的用户。那,或者它与opencv有关。在没有 Pycharm 的情况下运行它可能会有所帮助吗?
  2. 这个内存问题是 RAM 问题还是存储问题?我觉得奇怪的是图片本身只占用了大约 22 GB 的存储空间,但其中有 6% 的人遇到了这个错误。

标签: pythonmachine-learningmemorypycharm

解决方案


推荐阅读