我一直在努力弄清楚为什么我的程序消耗了如此多的系统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之类的操作,因此调试版本通常比优化版本使用更多的内存。
在发行版本中,我怀疑堆管理器保留的内存比您实际用作性能优化的更多。