预分配std :: map <unsigned long =“”long,void =“”* =“”>,如何正确预分配?</unsigned>

时间:2012-09-05 16:20:53

标签: stl map

问题:

我正在处理非常大的数据集,最多可达8 * 1024 * 1024个身份;

  1. 我预先分配了一个由void *部分指向的结构数组。
  2. 'free'指针被推入堆栈,在使用时弹出,并在从hash_map中删除时被推送。 (这接近256mb的内存)

  3. 我已将大部分系统时间/性能确定为在std :: hash_map的添加操作中使用。

  4. 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:

    1. 创建堆栈&lt;对*&gt; pointer_stack,并推送预先分配的指针,
    2. 弹出一个指针。分配值;
    3. 插入hash_map:
    4. 找到该项目,获取一个指向该地址的指针:即使我调用了insert,看起来hash_map也分配了一对新的。
    5. 这使得移除&amp;推到堆栈不可行。

1 个答案:

答案 0 :(得分:1)

你必须使用map吗?即使您使用自定义分配器失败malloc缓慢,map的实现仍然需要执行树重新平衡很多次,我认为您不能改变它。

如果地图是只读的(即insert的唯一用途是在使用之前填充它),只需要有一个键/索引对的排序数组,并使用二进制搜索。然后搜索将与map一样快,并且将消耗更少的内存。为方便起见,您始终可以使用operator[]和迭代进行包装。

C ++ 11 unordered_map允许通过reserve()方法进行预分配。搜索/插入/删除将花费不变的时间。但是,它将比std :: map消耗更多内存。