在用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. C/C++ Volatile关键词深度剖析

    文章来源:http://hedengcheng.com/?p=725 背景 此微博,引发了朋友们的大量讨论:赞同者有之:批评者有之:当然,更多的朋友,是希望我能更详细的解读C/C++ Volatile ...

  2. 微信小程序传值

    方式一:通过设置id方式传值 <button class="btninvest" bindtap="goinvet" id="{{item.tx ...

  3. Netty实例

    Netty是基于JDK NIO的网络框架 简化了NIO编程, 不用程序自己维护selector, 将网络通信和数据处理的部分做了分离 多用于做底层的数据通信, 心跳检测(keepalived) 1. ...

  4. Vue.js随笔三(npm init webpack my-project指令安装失败解决方案)

    如果没有安装淘宝给的镜像就先安装一下,指令如下,对!就是如此简单: npm install -g cnpm -registry=https://registry.npm.taobao.org 首先输入 ...

  5. CentOS7.2下安装mongoDB3.2.8

    最近在又在倒腾MongoDB,把安装配置的相关命令贴出来 1.下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70- ...

  6. MyBatis操作oracle的一些问题加载

    mybatis在更新数据或者插入数据为空的时候必须指定jdbcType类型 1:传入的参数是对象类型 User user =new User(); INSERT INTO t_user ( id, u ...

  7. 重构改善既有代码设计--重构手法01:Extract Method (提炼函数)

    背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner() ...

  8. java多线程机制2(安全问题)

    线程状态图: ================================================================================= /* * 线程安全问题 ...

  9. DHTML Object Model&DHTML&DOM

    DHTML Object Model:DHTML对象模型,利用DHTML Object Model可以单独操作页面上的对象,每个HTML标记通过它的ID和NAME属性被操纵,每个对象都具有自己的属性. ...

  10. 在外网使用ssh连接内网中的多台Linux服务器

    最近因为要对全球工控机网络进行协议扫描,需要在实验室配置几台服务器,因为我们只有一个IP地址,所以是用路由器搭建了一个内网(拓扑结构如下图).但是这样做了之后无法在宿舍通过ssh直接连接服务器,因为那 ...