我一直在努力弄清楚为什么我的程序消耗了如此多的系统RAM。我正在将文件从磁盘加载到几个动态分配的数组的结构向量中。根据任务管理器,一个16MB的文件最终会消耗280MB的系统RAM。文件中的类型主要是带有一些短裤和一些长号的字符。该文件中有331,000条记录,平均包含约5个字段。我将向量转换为一个结构,将内存减少到大约255MB,但这似乎仍然很高。由于向量占用了大量内存,因此程序的内存不足,因此我需要找到一种使内存使用更加合理的方法。

我写了一个简单的程序,用1,000,000个char指针填充一个向量(或数组)。我希望它为每个分配4 + 1个字节,从而提供5MB的存储空间,但实际上它使用的是64MB(阵列版本)或67MB(向量版本)。当程序第一次启动时,它仅消耗400K,那么为什么要为数组分配额外的59MB或为向量分配62MB?这个额外的内存似乎是每个容器的内存,因此,如果我创建一个size_check2并复制所有内容并运行它,程序将使用135MB内存来存储10MB的指针和数据。

提前致谢,

size_check.h

#pragma once

#include <vector>

class size_check
{
public:
    size_check(void);
    ~size_check(void);

    typedef unsigned long   size_type;

    void stuff_me( unsigned int howMany );

private:
    size_type**         package;
//  std::vector<size_type*> package;
    size_type*          me;
};


size_check.cpp

#include "size_check.h"

size_check::size_check(void)
{
}

size_check::~size_check(void)
{
}

void size_check::stuff_me( unsigned int howMany )
{
    package = new size_type*[howMany];
    for( unsigned int i = 0; i < howMany; ++i )
    {

        size_type *me = new size_type;
        *me = 33;
        package[i] = me;
//      package.push_back( me );
    }
}


main.cpp
#include“ size_check.h”

int main( int argc, char * argv[ ] )
{
    const unsigned int buckets = 20;
    const unsigned int size = 50000;

    size_check* me[buckets];

    for( unsigned int i = 0; i < buckets; ++i )
    {
        me[i] = new size_check();
        me[i]->stuff_me( size );
    }
    printf( "done.\n" );
}

最佳答案

在我使用VS2010进行的测试中,调试版本的工作集大小为52,500KB。但是一个发布版本有一个工作集
大小为20,944KB。

由于调试堆管理器执行诸如创建memory fences之类的操作,因此调试版本通常比优化版本使用更多的内存。

在发行版本中,我怀疑堆管理器保留的内存比您实际用作性能优化的更多。

07-24 09:45
查看更多