我有一个庞大的数组(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