1

问题:

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

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

  3. 我已经确定大部分系统时间/性能消耗在 std::hash_map 的添加操作中。

结构顺序;std::hash_map 订单数据库;

我真正想做的就是将 MAX_ORDERS 传递给构造函数:

std::hash_map OrderDatabase(MAX_ORDERS);

// 并让它预先分配容器,以便插入/删除不涉及 malloc/free。

建议表示赞赏!我试图严格遵守 STL/C++ 作为旁注。

编辑/更新:

我还尝试了以下方法:

hash_map 地图测试;hash_map::allocator_type MapAlloc = MapTest.get_allocator();

对 *ary = MapAlloc.allocate(MAX_ORDERS); // 这里的问题是 ulonglong 是 const!

想法是将每个都推入堆栈,然后弹出分配,并使用 insert 而不是 maptest[id] = ptr;

//更新2:

  1. 创建stack<pair *> pointer_stack,并推送预分配的指针,
  2. 弹出一个指针。赋值;
  3. 插入 hash_map:
  4. 找到该项目,获取指向地址的指针:尽管我调用了 insert,但 hash_map 似乎分配了一个新对。

这使得移除和推送到堆栈是不可行的。

4

1 回答 1

1

你必须使用map吗?即使您malloc使用自定义分配器解决了缓慢的问题,map's 的实现仍然需要多次执行树重新平衡,我认为您无法改变这一点。

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

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

于 2012-09-05T17:33:04.237 回答