学习笔记--bag of words(4)---内存不够用了

来源:互联网 发布:今年流行的网络词汇 编辑:程序博客网 时间:2024/03/29 16:23

2011.3.30 

   前面运行bag of words的例子碰到了内存不够用,我的内存是2g的,虚拟内存设置了6g,大概系统用了2.5g内存时,在new的时候就出现了badalloc错误,试着在boot。ini 里设置了3gb参数,也没用。

    只有试着安装个64位的win7看看。

    在查资料的时候意外发现了mpi-ch,貌似可以在局域网内运行并行程序。一定要试试。

     http://hi.baidu.com/_00000000/blog/item/a5068e5635d51a153a2935b5.html

 

 

用了几个小时,终于安装了64位的win7,注意opencv也需要重新编译为x64的。貌似程序能处理更多的图片了。明天再看结果吧。

 

2011.3.31

  程序还在运行,昨晚刚装了系统,么取消睡眠模式。浪费了15个小时,悲剧。。

  win7里面,一直没把物理内存用完,显示物理内存只用了58%,另外虚拟内存设置为系统管理。

 ( 微软最大的敌人竟然是自己,估计还得有1,2年,才能普及win7.)

 计算sift特征终于运行完了。不过在cluster的时候,又出了内存分配错误,cv::mat()分配一个大概800m的内存,出现内存不足的错误。在wiin7 32上,cv::Mat testmat(18550,20000,CV_32FC1);能通过 cv::Mat testmat(18650,20000,CV_32FC1);就不行了。大致是达到2g物理内存的极限。64位机上cv::Mat testmat(30000,20000,CV_32FC1);能通过,cv::Mat testmat(40000,20000,CV_32FC1);不能。总之是有限制的。分配30000*20000*32b时电脑运行了好久,说明虚拟内存已经起作用。

现在的问题是

1)加一条2g内存能起作用吗?既然虚拟内存能起作用,虽然加了可能能解决问题,当可能不需要这么做。

2)c++,或者系统对程序最大内存有约束吗?既然是动态分配的,应该没限制才对。

3)改进算法使用更小的内存。可能吗?网上有这样的例子http://www.shamoxia.com/html/y2010/2257.html,改进kmeans方法

4)虚拟内存设置大一点有用吗?

 

网上找到的一段解释

First thing first, 3GB (or 2GB) user space does NOT mean that you can allocate it as single chunk of bytes. The system may not (most probably) have that large 'single' chunk of bytes.

You may have to loop for multiple allocations.

On Windows, new and malloc are slow. You should use HeapAlloc for moderate allocation (around 500B to few KBs). For larger allocations you can use VirtualAlloc, do memory mappping (to actually play with pointers). Even then you CANNOT have more than 2/3 GB alloaction for your process.

For this, On 32-bit systems you can use PAE - Physical Address Extension. On Windows you can achieve the same by using AWE library. Look at MSDN.

On 64-bit platform, you must have that much of physical and/or virtual memory.

cvcreatemat实际是调用malloc方法,在堆中分配内存

只有google到修改栈大小的。没说堆的大小也受控制,上面的话说32位系统有最大3g内存每个进程的限制,64位系统没这个问题。

明天去修改下虚拟内存的大小看看。

 

2011.4.2

修改虚拟内存大小后执行是不出错了,但是一天过去了,貌似了虚拟内存都没分配好。

突然想到kmeans的时候内存不要设置2000m,400看看,效果提升明显不,如果没什么提升,就不要再这个地方花时间了。

否则就把kmeans算法改下。

 

2011.4.8 接下去要做的。

比较sift,surf,hog等的速度和性能

修改kmeans以减少对内存的支持。

 

2011.4.13

执行svm训练的时候出现了内存不够的错误。在cvMemStorageAlloc函数中。检查代码发现,opencv创建文件时块大小是2的18次方。

相关代码如下:

cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags )
{
    CvFileStorage* fs = 0;
    char* xml_buf = 0;
    int default_block_size = 1 << 18;
    bool append = (flags & 3) == CV_STORAGE_APPEND;
    bool isGZ = false;

 

 

svm的错误刚好是下面的代码引起的

size_t max_free_space = cvAlignLeft(storage->block_size - sizeof(CvMemBlock), CV_STRUCT_ALIGN);
        if( max_free_space < size )
            CV_Error( CV_StsOutOfRange, "requested size is negative or too big" );

需求的size刚好=max_free_space,

这个不是在svm训练一开始就出错的,而是过了一段时间。

假设是svm训练结束准备写入数据的时候,也就是 svm.save( svmFilename.c_str() );时候出错。

跟踪看看

原创粉丝点击