繁体   English   中英

std :: unordered_map的内存使用率很高

[英]std::unordered_map very high memory usage

昨天我尝试使用std::unordered_map ,此代码使我感到困惑,它使用了多少内存。

typedef list<string> entityId_list;
struct tile_content {
   char cost;
   entityId_list entities;
};
unordered_map<int, tile_content> hash_map;

for (size_t i = 0; i < 19200; i++) {
   tile_content t;
   t.cost = 1;
   map[i] = t;
}

所有这些代码部分都是在MS VS2010中以调试模式编译的。 我在任务管理器中看到的是大约1200 kb的“干净”进程,但是在填充hash_map它将使用8124 kb的内存。 这是unordered_map正常行为吗? 为什么要使用那么多的内存?

unordered_map结构旨在以使添加,删除,查找和无序遍历有效的方式来容纳大量对象。 对于小数据结构,这并不意味着内存有效。 为了避免与调整大小相关的惩罚,它在首次创建时会分配许多哈希链头。

大约2万个对象大约需要6MB,因此每个对象300个字节。 假设哈希表的大小可能比当前条目具有更多的存储桶,则每个存储桶本身可能是指向碰撞对象列表或向量的指针,所有涉及的每个堆分配可能已四舍五入到最接近的值。 2的幂,并且已经调试过,可能会产生一些额外的膨胀,这一切对我来说都是正确的。

无论如何,您不会对调试版本;-P中的任何内容的内存或CPU效率感到同情。 Microsoft可以在其​​中注入他们喜欢的任何倾斜,并且用户无权获得对性能的期望。 如果您发现在优化的版本中不好,那么您有什么要谈的。

更一般而言,它如何与size()缩放非常重要,但是完全可以怀疑一个程序如何与大量相对较小的无序映射一起使用。 值得一提的是,在某个size()甚至矢量中的蛮力搜索,排序后的矢量中的二进制搜索或二叉树都可能胜过无序映射,并且存储效率更高。

这并不一定意味着哈希映射使用了如此多的内存,而是该进程已从操作系统请求了那么多的内存。

然后,该内存将用于满足程序的malloc / new请求。 为了提高效率,某些(或大多数,我对此不太确定)内存分配器需要的操作系统内存比当时需要的更多。

要知道unordered_map使用了多少内存,我将使用perftools之类的内存分析器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM