Caffe运行Mnist数据集程序提示Cannot Allocate Memory错误如何解决
问题根因定位
从报错栈可以看到,错误触发在caffe::db::LMDB::Open()调用阶段,LMDB返回状态码12对应Linux系统标准错误ENOMEM(无法分配内存),错误和模型结构、Solver配置无关,是LMDB数据库初始化环节的问题。
对应解决方案
按出现概率从高到低排列:
- LMDB文件路径错误/损坏
首先确认网络配置文件中填写的mnist_train_lmdb路径和实际LMDB文件存放路径一致,可执行ls mnist_train_lmdb验证,正常会输出data.mdb和lock.mdb两个文件。如果文件缺失或大小异常,重新用MNIST原始数据集生成LMDB文件即可。 - LMDB映射大小超出系统限制
32位系统、WSL1、嵌入式ARM平台默认的进程虚拟地址空间上限较小,而Caffe源码默认给LMDB设置了1TB的映射空间,超出系统限制会触发内存分配报错。修改方案:
打开Caffe源码路径下src/caffe/util/db_lmdb.cc,找到mdb_env_set_mapsize(mdb_env_, 1UL << 40)这一行,将1UL << 40(即1TB)修改为10UL << 20(即10MB,完全满足MNIST数据集大小需求),重新编译Caffe即可解决。 - 系统物理内存不足
运行free -h查看当前系统空闲内存,MNIST训练仅需几十MB空闲内存即可正常运行,如果剩余内存不足,关闭其他占用内存的进程后重试。 - LMDB文件权限异常
执行ls -l mnist_train_lmdb确认运行Caffe的用户对LMDB文件夹及内部文件有可读权限,权限不足的话执行chmod -R 644 mnist_train_lmdb/*赋权后重试。
内容的提问来源于stack exchange,提问作者Arslan Majid
相关产品推荐
相关产品推荐

