質問
私はテキストの60ギガバイトを解析し、マップに挿入し、検索をたくさんやってます。 私はちょうどブースト:: unordered_setを使用して開始し、後押し:: unordered_map 私のプログラムは、これらの容器に充填開始すると、彼らはどんどん大きく成長し始めると、これはこれらのコンテナにメモリを割り当てる事前にすることをお勧めだろうかと思いまして。 何かのようなもの (N)を:: get_allocatorを()MYMAP割り当てます。 ?
または私はちょうど割り当て、自分自身で要因を成長把握するためにそれらを残す必要がありますか? コードは
このように見えます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;
}
}
事前に感謝します。
解決
私はそれを使用すると、1つの方法は、他のより良い動作するかどうかを示す確かなデータを生成できるようになる両方の方法を、しようとするだろう。私たちは、この方法が最適になるかについて、すべての日を推測することができますが、ほとんどのパフォーマンスの問題と同様に、行うための最善のことは、それを試してみると何が起こるか見て(そして実際に固定必要な部分を修正)です。
言われていること、ブースト著者は、それはかなり可能性として-で正常に動作しますので、非常にスマートであるように見えます。あなただけテストして参照してくださいする必要があります。
他のヒント
によると、 unordered_set
とunordered_map
両方がメソッドを持っている。
void rehash(size_type n);
それは、少なくともn
バケットを含むようにハッシュテーブルを再生成しています。 (それはreserve()
はSTLコンテナのため何んように聞こえる)。
正直なところ、私はあなたがあなた自身のアロケータを書いオフ最善だと思います。あなたは、例えば、その後、すべてのあなたの楽しみのためにpreallocate(int N)
を使用して、Nバイトを予約しますunordered_map::get_allocator()
と呼ばれる方法でアロケータを作ることができます。また、あなた自身のアロケータで、一度に巨大な塊をつかむために、それを伝えることができます。