大规模数据对 vector 和 map 的压力

转载 2008年09月30日 11:49:00

平时的机器上跑个小程序,几百条数据,基本不会发现容器之间的差别。这也可能是许多人不去关心容器底层的原因。

这篇文章是我拿到一个简历,上面写到精通STL,遂想出这个问题,让其来分析一下。(每次面试问过的我都公开,不问重复的 ^D)

如果我们有超过十亿个用户自定义的对象 People,每个对象大小暂定12字节,那么分别用 vector 和map存储,在查找上性能有什么差别。

C++标准规定 vector是连续的序列容器,这就是说在容器中相邻的数据,在物理内存中也相邻。map的底层是RBTree,容器内相邻的元素在物理内存中不一定相邻。由于map采用树的结构,所以每个节点除了数据占有的内存之外,还要left,right,parent 指针,每个指针4Bytes。

不包括容器本身占的空间,通常一页内存为4KB,那么如果用vecotr存储的话,一页可以放341个对象,如果用map的话,一页内存可以放171个,相差近 2 倍,所以用map存储的话,在查找的时候,更容易产生内存缺页,而且是频繁的缺页,这样map就会因为大规模的数据而性能严重下降。

此外,由于map的节点很可能分布在内存的各个角落,容器内相邻可是物理不相邻更容易产生内存缺页中断,这种情况恐怕更糟糕!

当然vector也有其不可避免的缺点:

在存储的过程中,他会不断的内存扩张,复制数据的过程也是蛮昂贵的说(即使我们可以用很大的初始容量来尽量减少内存扩张的次数)。此外为了能用binary_search,需要vector有序,这个时间也不容忽视,绝不忽视。

但是当一切尘埃落定,我们大部分操作都在查找的时候,性能的差距就会不言自明了。

降低数据压力的几种解决方案

在现代的软件系统中,几乎所有的系统都使用到了数据库,不论是关系型数据,例如MySql、SQLite、Oracle、SQLServer等,还是非关系性数据,例如mongoDB、redis等。本文已web...
  • xidiancyp
  • xidiancyp
  • 2016年05月27日 21:21
  • 4081

简述list,vector,map,set四中STL的数据结构的区别和各自特点

1 vector     向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即...
  • hhlv77
  • hhlv77
  • 2013年11月08日 20:31
  • 1216

C++中vector和map使用详解

标准库Vector类型 使用需要的头文件: #include Vector:Vector 是一个类模板。不是一种数据类型。 Vector是一种数据类型。 一、 定义和初始化 Vecto...
  • bzhxuexi
  • bzhxuexi
  • 2014年04月20日 14:31
  • 10113

Map/Reduce:大规模集群上的简化数据处理

  • 2014年07月08日 16:08
  • 316KB
  • 下载

cocos2d-x 中的数据结构集合(容器)(CCArray,Map,Vector)使用笔记

第1部分、CCArray cocos2d::CCArray(在3.0中已经过时,将被vector替代)是一个可变数组集合容器,放在其中的元素是有序的,并且可以重复,可以通过索引来获得元素,可以对容器内...
  • windvally
  • windvally
  • 2015年08月11日 16:14
  • 773

Java 常用数据结构深入分析(Vector、ArrayList、List、Map)

   在网上偶然看到一篇关于 Java 常用的数据结构的文章,分析的十分透彻,特此记下,以为参阅 :)  线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相...
  • tomato99
  • tomato99
  • 2011年04月17日 22:29
  • 343

Cocos3.0数据结构Value Map Vector

cocos2d::Value是许多基本类型(int,float,double,bool,unsigned char,char*和std::string)还有std::vector,std::uno...
  • woshispl
  • woshispl
  • 2014年08月13日 15:25
  • 627

cocos2d-x3.0中数据类型vector,map和value的分析和挖掘

coco2d-x3.0中数据类型vector,map,value的分析,很好的结合了c++标准库的方法和oc的内存管理体系,拜托了以前oc的数据存储模式,更好的适合c++的开发。...
  • buaa_sapphire
  • buaa_sapphire
  • 2014年07月23日 17:26
  • 2574

Clojure中的关联数据结构(Vector/Map/Set)

在刚刚接触clojure这门语言时,总是容易搞不清楚某个函数都适用于哪些的数据结构,为什么有的函数可以用于vector,却不能用于list呢。其实主要是因为各种类型实现的接口不同,本文总结一下Cloj...
  • zdplife
  • zdplife
  • 2016年08月03日 16:28
  • 668

C++存储数据结构List、CArray、Vector和Map使用分析

list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。在STL中,list和vector一样,是两个常被使用的容器。和vector不一样的是,list不支持对元素的任意存取。list中...
  • dongpanshan
  • dongpanshan
  • 2012年11月29日 16:20
  • 5005
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大规模数据对 vector 和 map 的压力
举报原因:
原因补充:

(最多只允许输入30个字)