2012-09-05 119 views
1

問題:std :: map的預分配<unsigned long long,void *>,如何正確預分配?

我正在處理非常大的數據集,最多可以處理8 * 1024 * 1024的標識;

  1. 我已經預先分配的結構的陣列,通過空隙*部分指向。
  2. 的「自由」指針堆棧上推動,彈出,因爲它們被使用,並推,因爲它們是從的hash_map除去。 (這是接近256mb的內存)

  3. 我已經確定大部分系統時間/性能是在std :: hash_map的添加操作中使用的。

struct Order; std :: hash_map OrderDatabase;

我真的很想做的,僅僅是通過MAX_ORDERS到構造函數:

的std ::的hash_map OrderDatabase(MAX_ORDERS);

//並具有使插入/刪除不參與的malloc /自由是預先分配的容器。

建議感激!我試圖嚴格遵守STL/C++作爲附註。

編輯/更新:

我也試過如下:

的hash_map MapTest; hash_map :: allocator_type MapAlloc = MapTest.get_allocator();

對*進制= MapAlloc.allocate(MAX_ORDERS); //這裏的問題是,ulonglong是const!

的想法是推每一個對一個堆棧,並且彈出了ALLOC,和使用插入來代替maptest [ID] = PTR;

//更新2:

  1. 創建堆棧<對*> pointer_stack,並推動預分配指針,
  2. 彈出的指針。分配值;
  3. 插入到hash_map中:
  4. 找到該項目,獲取一個指向該地址的指針:即使我調用insert,它似乎仍會分配一個新對。

這使得去除&推動堆棧不可行。

回答

1

你有使用map?即使你用自定義分配器擊敗malloc緩慢,map的實現仍然需要很多次執行樹重新平衡,我認爲你不能改變它。

如果地圖intented被只讀(即insert的唯一用途是在使用之前填充它),只需要一個有序的鍵/索引對數組,並使用二進制搜索。那麼搜索速度將會高達map,並且會消耗更少的內存。爲了方便起見,您總是可以用operator[]和迭代包裝它。

C++ 11 unordered_map允許通過reserve()方法進行預分配。搜索/插入/刪除將需要不斷的時間。但是,它將消耗比std :: map更多的內存。

+0

我將重新編輯它,它應該是後視Hash_map。此外,系統上的內存將在24-48gb範圍內,任何內存 - >時間折衷都是需要的。預留內存即使從未使用過,也是最佳的。 –

+0

'hash_map'與C++ 11/Boost中的'unordered_map'類似,只是我沒有看到SGI/VC++實現具有'reserve()'方法,所以請嘗試使用Boost或C++ 11中的一個,可能會更好。 – hamstergene

+0

怎麼樣排序數組建議 - 有什麼妨礙您使用它? – hamstergene

相關問題