插入 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 的某个位置插入元素?