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; 
    }

   }

前もって感謝します

4

3 に答える 3

11

ドキュメントによると、 と の両方unordered_setunordered_mapメソッドがあります

void rehash(size_type n);

少なくともnバケットが含まれるようにハッシュテーブルを再生成します。reserve()( STLコンテナの場合と同じように聞こえます)。

于 2009-05-19T06:02:53.147 に答える
4

両方の方法を試してみると、一方の方法が他方よりもうまく機能するかどうかを示す確かなデータを生成できます。どの方法が最適かについて一日中推測することができますが、ほとんどのパフォーマンスの問題と同様に、最善の方法はそれを試して何が起こるかを確認することです (そして、実際に修正が必要な部分を修正します)。

そうは言っても、Boost の作成者は非常に頭が良いように見えるので、そのままで問題なく動作する可能性が高いです。テストして確認するだけです。

于 2009-05-19T04:06:12.487 に答える
0

正直なところ、独自のアロケーターを作成するのが最善だと思います。たとえば、preallocate(int N)N バイトを予約するメソッドを呼び出してアロケータを作成しunordered_map::get_allocator()、すべての楽しみのために使用することができます。さらに、独自のアロケーターを使用して、一度に巨大なチャンクを取得するように指示できます。

于 2009-05-19T03:50:09.327 に答える