在用OpenCV训练分类器(特别是训练Adaboost类型的分类器)的时候,当样本的数量特别大的时候,就会出现申请内存不够的情况,很早以前碰到过这样的情况,最近再训练的时候又出现了这样的情况,于是在网上找了一下解决方法。

首先给出我的配置吧,win7 64位 + vs2010 + opencv2.4.9,其实这个问题的产生应该只与系统有关系

本文的绝大部分是引用自博友lff0305的“使用LargeAddressAware压榨额外的用户态内存”,在此向其表示感谢!

一般情况下,无论在32位系统还是64位系统下,一个Win32用户进程可用的内存空间只有2GB少一点。那么,假设一个Win32程序内存不够用了,又不想(或者没办法)编译成X64的,怎么办呢,MS提供了一种方法,Linker中的LargeAddressAware参数。
启用它,可以获得额外的用户态内存。我在自己的X64系统下测试,如果没有启用,可以申请2GB不到;但是启动了这个参数,则可以申请将近4GB(因为还要受32位程序32位指针的限制):

程序很简单,如下:

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. int c = 0;
  4. while (true) {
  5. void * p = malloc(1024 * 1024 * 32);
  6. if (p != 0) {
  7. c++;
  8. printf("alloc %d MB OK\n", c * 32);
  9. } else {
  10. break;
  11. }
  12. }
  13. printf("alloc %d MB Totally\n", c * 32);
  14. getchar();
  15. return 0;
  16. }

运行结果是

该程序如果不设置LargeAddressAware参数的话是1986MB。
我自己没有测试32位的系统,但是查到的资料说需要设置/3GB的启动参数。
对于已经存在的程序(没办法编译),可以使用VC中带的editbin.exe工具把该标志位打开:

这样这个程序也可以使用超过2GB的内存了。
同样对于一个exe,可以使用dumpbin.exe来验证。
如果dumpbin.exe /headers 文件名.exe
显示 Application can handle large (>2GB) addresses
那么说明该应用程序可以使用超过2GB的内存
当然这种方法的缺点:
1. 在64位系统上没办法使用超过4GB的内存;不过以前只能用2G,聊胜于无了;

2. 在32位系统上必须打开/3GB启动参数,为用户态程序预留3GB的内存

3. 对于带有自校验的程序,不适用,因为dumpbin相当于修改了这个exe,那么文件校验肯定是失败了;

总之最终的解决方法还是使用(或者编译出)X64的程序。

-----------------------------------------------以上内容均引自使用LargeAddressAware压榨额外的用户态内存----------------------------------------

由于我的系统也是64位的,所以也没有对32位系统做相关的测试。

如果是等待编译的程序,则可以按照上面的方式在vs中进行修改;如果是已经编译好的程序,则可以用editbin.exe工具打开LargeAddressAware标志位。接下来主要是说一下用editbin.exe工具打开LargeAddressAware标志位。因为以前也没用过这玩意,所以刚开始看到了还不大会弄,看原博主的贴图中以为是直接把editbin.exe复制到相应的文件夹下就可以直接用了,可并不是这样,因为执行editbin还需要link.exe和MSPDB100.DLL,这在vs安装路径中很容易找到。后来发现可以直接通过Visual Studio命令提示来操作。可以在开始按钮中打开该命令提示,如图

在打开命令提示后,就可以用调用editbin.exe了,如图

将要已编译好的要修改的程序的完整路径放在最后面。执行完执行可以用dumpbin来查看,如图

看到显示 Application can handle large (>2GB) addresses,那么说明该应用程序可以使用超过2GB的内存。

最后附上一个链接,在这个链接里面可以看到win系统的相关内存限制说明,网址:

Memory Limits for Windows and Windows Server Releases

openCV训练程序申请内存不足的更多相关文章

  1. 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法

    opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...

  2. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  3. OpenCV训练分类器制作xml文档

    OpenCV训练分类器制作xml文档 (2011-08-25 15:50:06) 转载▼ 标签: 杂谈 分类: 学习 我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad( ...

  4. opencv 训练自己的分类器汇总

    原地址:http://www.cnblogs.com/zengqs/archive/2009/02/12/1389208.html OpenCV训练分类器 OpenCV训练分类器 一.简介 目标检测方 ...

  5. 使用OpenCV训练Haar like+Adaboost分类器的常见问题

    <FAQ:OpenCV Haartraining>——使用OpenCV训练Haar like+Adaboost分类器的常见问题 最近使用OpenCV训练Haar like+Adaboost ...

  6. java\c程序的内存分配

    JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该 ...

  7. 程序的内存分配 C\C++

    原文:http://blog.csdn.net/oohaha_123/article/details/24460425 程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区( ...

  8. C程序的内存分配

    一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...

  9. C语言和C++中动态申请内存

      在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h>  ...

随机推荐

  1. windows中apache+tomcat整合,使php和java项目能够独立运行

    一.下载和安装 1.安装php  网上有安装教程,不再赘述 2.安装apache 比如安装目录为e:\apache;  项目根目录为e:\www;   网上有安装教程,不再赘述 3.安装jdk  不再 ...

  2. TestNG指南

    转载自:http://blog.csdn.net/bigapplestar/article/details/7300137 今天突然收到通知,统一改用TestNG写测试用例,开始查这方面的资料,学习一 ...

  3. 移动端H5上传图片并压缩上传

    手头上的这个项目主要是在微信内运行的一个网站,需要用户上传手机内的照片,而现在手机照片尺寸越来越大,直接上传的话的确上传进度慢影响用户体验而且也会给服务器增加压力,所以利用H5的新特性压缩后上传不失为 ...

  4. 数字配对(bzoj 4514)

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

  5. 51nod 1074 约瑟夫环 V2

    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...

  6. SMTP暴力破解

    这里实现一个SMTP的暴力破解程序,实验搭建的是postfix服务器,猜解用户名字典(user.txt)和密码字典(password.txt)中匹配的用户名密码对, 程序开发环境是: WinXP VC ...

  7. 天梯赛 L2-009 抢红包

    题目链接 没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢红包的记录,请你统计一下他们抢红包的收获. 输入格式: 输入第一行给出一个正整数N(<= 104),即参与发红包和抢红包的总人数 ...

  8. 二. Jmeter--关联

    1. 首先建立一个线程组(Thread Group),为什么所有的请求都要加入线程组这个组件呢?不加不行吗?答案当然是不行的.因为jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建 ...

  9. struts入门

    1.概念

  10. Linux中切换用户变成-bash4.1-$的解决方法

    原因是root在/root下面的几个配置文件丢失,将/etc/skel/目录下的三个文件拷贝到用户家目录即可 cp /etc/skel/.bashrc /root/ cp /etc/skel/.bas ...