我有一個龐大的數組(ParticleId[]
)唯一整數(代表粒子ID)以隨機順序存儲在內存中。我需要構建一個哈希表來將每個ID映射到它在數組內的位置,即從ID到索引。 ID不一定是連續的整數,所以一個簡單的查找數組不是一個好的解決方案。高效地初始化unordered_map整數對的大數據集
我目前使用C++ 11的unordered_map
容器來實現這一點。地圖初始化用一個循環:
unordered_map <ParticleId_t, ParticleIndex_t> ParticleHash;
ParticleHash.rehash(NumberOfParticles);
ParticleHash.reserve(NumberOfParticles);
for(ParticleIndex_t i=0;i<NumberOfParticles;i++)
ParticleHash[ParticleId[i]]=i;
的ParticleId_t
和ParticleIndex_t
只是的typedef-ED整數。 NumberOfParticles
可能很大(例如,1e9
)。就散列表而言,ParticleId[]
數組和NumberOfParticles
是const
。
目前需要相當多的時間來構建如上所述的unordered_map
。我的問題是:
- 是
unordered_map
這個問題的最佳選擇?- 會
map
會更快初始化,雖然它可能不是在查找效率?
- 會
- 是否可以加快初始化?
- 使用
ParticleHash.insert()
比使用ParticleHash[]=
快嗎?或任何其他功能? - 鑑於我的密鑰已知爲獨特的整數,有沒有一種方法來優化地圖以及插入?
- 使用
我正在考慮將英特爾concurrent_unordered_map
並行它。但是,這會引起對英特爾TBB庫的依賴,如果可能,我希望避免這種情況。有使用本地STL容器的簡單解決方案嗎?
更新:
現在我已經恢復到一個普通的分類索引表,並依靠bsearch
進行查找。至少該表的初始化現在快20倍,並且可以很容易地並行化。
看看這個 - 包括有關在構造函數中指定bucket大小的註釋:http://stackoverflow.com/questions/11614106/is-gcc-stdunordered-map-implementation-slow-if-so-why –
使用'std :: map'你可以傳遞一個提示迭代器來加速插入。如果你知道下一個鍵是地圖上的最後一個鍵,你可以傳遞結束迭代器作爲我相信的提示。我不知道這是否比無序地圖更快。還要考慮boost提供的一些flat_map數據結構。 –
@JerryJeremiah:啊,我用的是gcc4.7.2。也許這是原因。在確認這個之前,我必須找到另一個編譯器。 – Kambrian