优化Boost无序映射和集合,C++

4
我将解析60GB的文本,并在映射中进行大量插入和查找操作。我刚开始使用boost::unordered_set和boost::unordered_map。随着我的程序填充这些容器,它们变得越来越大,我想知道是否预先为这些容器分配内存是一个好主意。例如:mymap::get_allocator().allocate(N); 还是应该让它们自己分配内存并找出增长因子?代码看起来像这样。
boost::unordered_map <string,long> words_vs_frequency, wordpair_vs_frequency;   
boost::unordered_map <string,float> word_vs_probability, wordpair_vs_probability,
           wordpair_vs_MI;                  
//... ... ...                                   

N = words_vs_frequency.size();
long   y =0; float MIWij =0.0f, maxMI=-999999.0f;
for (boost::unordered_map <string,long>::iterator i=wordpair_vs_frequency.begin(); 
                     i!=wordpair_vs_frequency.end(); ++i){
if (i->second >= BIGRAM_OCCURANCE_THRESHOLD)
    {
    y++;
    Wij = i->first;
    WordPairToWords(Wij, Wi,Wj);
    MIWij =  log ( wordpair_vs_probability[Wij] /
             (word_vs_probability[Wi] * word_vs_probability[Wj]) 
            );

    // keeping only the pairs which MI value greater than 
    if (MIWij > MUTUAL_INFORMATION_THRESHOLD)
        wordpair_vs_MI[ Wij ] = MIWij;
    if(MIWij > maxMI )
        maxMI = MIWij; 
    }

   }

提前感谢您的帮助

3个回答

11
根据文档,无序集合unordered_set和无序映射unordered_map都有一个方法。
void rehash(size_type n);

重新生成哈希表,使其至少包含n个存储桶。(听起来就像STL容器的reserve()函数所做的那样)。


4
我会尝试两种方法,这将让您生成硬数据,显示哪种方法比另一种更好。我们可以整天推测哪种方法最佳,但是像大多数性能问题一样,最好的方法是尝试并观察发生了什么(然后修复实际需要修复的部分)。
话虽如此,Boost的作者们似乎非常聪明,因此它很可能会按原样正常工作。您只需测试并查看即可。

0
说实话,我认为你最好自己编写分配器。例如,你可以创建一个带有名为preallocate(int N)的方法的分配器,该方法将保留N个字节,然后使用unordered_map::get_allocator()进行所有操作。此外,使用自己的分配器,你可以告诉它一次性获取大块内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接