问题:
我正在处理非常大的数据集,最多可达8 * 1024 * 1024个身份;
'free'指针被推入堆栈,在使用时弹出,并在从hash_map中删除时被推送。 (这接近256mb的内存)
我已将大部分系统时间/性能确定为在std :: hash_map的添加操作中使用。
struct Order; std :: hash_map OrderDatabase;
我真正想做的是将MAX_ORDERS传递给构造函数:
std :: hash_map OrderDatabase(MAX_ORDERS);
//让它预先分配容器,以便插入/删除不涉及malloc / free。
建议表示赞赏!我试图严格遵守STL / C ++作为旁注。
编辑/更新:
我也尝试了以下内容:
hash_map MapTest; hash_map :: allocator_type MapAlloc = MapTest.get_allocator();
pair * ary = MapAlloc.allocate(MAX_ORDERS); //这里的问题是ulonglong是const!
我的想法是将每个人推到一个堆栈,并弹出为alloc,并使用insert而不是maptest [id] = ptr;
//更新2:
这使得移除&推到堆栈不可行。
答案 0 :(得分:1)
你必须使用map
吗?即使您使用自定义分配器失败malloc
缓慢,map
的实现仍然需要执行树重新平衡很多次,我认为您不能改变它。
如果地图是只读的(即insert
的唯一用途是在使用之前填充它),只需要有一个键/索引对的排序数组,并使用二进制搜索。然后搜索将与map
一样快,并且将消耗更少的内存。为方便起见,您始终可以使用operator[]
和迭代进行包装。
C ++ 11 unordered_map
允许通过reserve()
方法进行预分配。搜索/插入/删除将花费不变的时间。但是,它将比std :: map消耗更多内存。