插入 unordered_map 时的 bad_alloc

Posted

技术标签:

【中文标题】插入 unordered_map 时的 bad_alloc【英文标题】:bad_alloc when inserting into unordered_map 【发布时间】:2019-04-15 04:01:15 【问题描述】:

在最近的项目中,使用了stl unordermap。当map中存储的key数量上升到6倍-7倍甚至8倍时,unordermap的insert接口的性能就出现了严重的瓶颈。随着插入元素数量的增加,在插入过程中会发生碰撞。碰撞打开到某个阈值,触发桶的增加,从而触发rehash。打印bucket_size可以看到bucketsize一直在增加,很贵。

这里是测试代码:

int main() 
    std::unordered_map<int, int> t;
    for (int i = 0; i <= 10000000; ++i) 
    t.insert(make_pair(i, 1));
    

我应该使用保留元素的数量来提高性能吗?

t.reserve(10000000)

【问题讨论】:

std::unordered_map 的性能取决于几个因素。大桶大小意味着哈希函数不是很好或最大负载因子非常高。你能发布你正在使用的key是什么,散列函数和max_load_factor是什么 你的问题和bad_alloc有什么关系?它在标题中,但你再也没有提到它。 您的问题是与性能瓶颈有关还是与插入元素时的 bad_alloc 有关? @ZanLynx 我在多线程中操作unordered_map,不知道是不是这个原因,如果元素没有保留程序会bad_alloc 如果您从多个线程插入容器,那么您需要使用锁定。如果你不是,那将解释你得到的任何错误。 【参考方案1】:

性能相关问题的最佳答案是 - “我们应该衡量”。

这是您的代码 sn-p 的基准测试 - http://quick-bench.com/O5rEF-B_HY9dOzAa7kLbtptUQcQ

【讨论】:

以上是关于插入 unordered_map 时的 bad_alloc的主要内容,如果未能解决你的问题,请参考以下文章

向 std::unordered_map 插入数据时访问冲突

有没有办法在 unordered_map 的某个位置插入元素?

在 Visual Studio 中放置并插入 unordered_map?

使用具有多个值的 unordered_map 移动插入

插入 unordered_map 丢失了

在不使用 if 的情况下插入/更新 std::unordered_map 元素的最快方法是啥?