【问题标题】:optimizing boost unordered map and sets, C++优化提升无序映射和集合,C++
【发布时间】:2010-10-27 05:21:46
【问题描述】:

我将解析 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; 
    }

   }

提前致谢

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    根据the documentationunordered_setunordered_map都有方法

    void rehash(size_type n);
    

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

    【讨论】:

      【解决方案2】:

      我会尝试两种方法,这将让您生成硬数据,显示一种方法是否比另一种方法更有效。我们可以整天猜测哪种方法是最佳的,但与大多数性能问题一样,最好的办法是尝试一下,看看会发生什么(然后修复实际需要修复的部分)。

      话虽如此,Boost 作者似乎很聪明,所以它很可能会按原样正常工作。您只需要测试并查看。

      【讨论】:

        【解决方案3】:

        老实说,我认为最好编写自己的分配器。例如,您可以使用名为 preallocate(int N) 的方法创建一个分配器,该方法将保留 N 个字节,然后使用 unordered_map::get_allocator() 来获得所有乐趣。此外,使用您自己的分配器,您可以告诉它一次抓取大块。

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 1970-01-01
          • 2015-10-12
          • 1970-01-01
          • 2013-03-31
          • 2014-01-10
          • 2020-11-17
          • 2019-03-27
          • 1970-01-01
          相关资源
          最近更新 更多