std::map 占用内存竟然达到1G,请高手指点

时间:2022-01-29 17:22:12
测试代码如下:

// EventTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <map>
using namespace std;
typedef std::map<int,int> IntMap;
int _tmain(int argc, _TCHAR* argv[])
{
IntMap testMap;
int i=0;
int j =0;
for( i=1; i< 10000000;i++)
{
int k =j++;
testMap.insert(IntMap::value_type(i,i));

if( 0 == i%10000)
{
cout << "Has Deal " << i << "lines" << endl;
}
}
getchar();
return 0;
}


这个测试程序占用的内存竟然接近1G,请高手指点。怎么需要那么大内存呢? 

13 个解决方案

#1


光这么多int都得几百M吧……

#2


我用gcc编译后测试竟也达到220M,。。。
不了解Map的内部存储机制。
理解中10M左右个map元素,一个map里存放的数据为8Byte,实际容量应该不至于是这的几倍吧。。。
感觉应该在百M内比较正常。。。

#3


map是红黑树,每个节点加上key,value和指针估计有不小于16字节了,我这里测试达到700M+了,可能是最后频繁换页引起的吧

#4


谢谢楼上的指点。
1,红黑树有left,right,parent三个指针,再加上color算上字节对齐就是24字节,然后加上map的<int,int>就32自己,1KW数据就是32*10,000,000 = 320M。
2,如果是分页引起的,有没有什么办法能让他降低到400M左右呢?
高手指点。

#5


这个估计没什么好办法了,不太清楚有没有优化的办法。

#6


学习了,好深奥啊。。。

#7


不要让帖子沉下去了,寻找高手。

#8


10000000*4/1024/1024 约等于382M, 加上红黑树的指针域,382*4 约等于1G了, 这个结果还算正常了,不算很离谱。

#9


一个活动进程,除了数据结构所需空间之外,你无法控制的缓冲区也要占用空间。

#10


引用 8 楼 dskit 的回复:
10000000*4/1024/1024 约等于382M, 加上红黑树的指针域,382*4 约等于1G了, 这个结果还算正常了,不算很离谱。

10000000*4/1024/1024 约等于38.2M吧

#11


可是.....你什麼時候需要做這種這麼大的東西呢?
如果沒有,問這個是沒啥意義,不如換其他儲存的方式。

#12


你装这么多东西, 还是放在硬盘里吧.

#13


我这里用了 864m内存

#1


光这么多int都得几百M吧……

#2


我用gcc编译后测试竟也达到220M,。。。
不了解Map的内部存储机制。
理解中10M左右个map元素,一个map里存放的数据为8Byte,实际容量应该不至于是这的几倍吧。。。
感觉应该在百M内比较正常。。。

#3


map是红黑树,每个节点加上key,value和指针估计有不小于16字节了,我这里测试达到700M+了,可能是最后频繁换页引起的吧

#4


谢谢楼上的指点。
1,红黑树有left,right,parent三个指针,再加上color算上字节对齐就是24字节,然后加上map的<int,int>就32自己,1KW数据就是32*10,000,000 = 320M。
2,如果是分页引起的,有没有什么办法能让他降低到400M左右呢?
高手指点。

#5


这个估计没什么好办法了,不太清楚有没有优化的办法。

#6


学习了,好深奥啊。。。

#7


不要让帖子沉下去了,寻找高手。

#8


10000000*4/1024/1024 约等于382M, 加上红黑树的指针域,382*4 约等于1G了, 这个结果还算正常了,不算很离谱。

#9


一个活动进程,除了数据结构所需空间之外,你无法控制的缓冲区也要占用空间。

#10


引用 8 楼 dskit 的回复:
10000000*4/1024/1024 约等于382M, 加上红黑树的指针域,382*4 约等于1G了, 这个结果还算正常了,不算很离谱。

10000000*4/1024/1024 约等于38.2M吧

#11


可是.....你什麼時候需要做這種這麼大的東西呢?
如果沒有,問這個是沒啥意義,不如換其他儲存的方式。

#12


你装这么多东西, 还是放在硬盘里吧.

#13


我这里用了 864m内存