Pergunta

I será analisar 60GB de texto e fazendo um monte de inserção e pesquisas em mapas. Eu só comecei a usar boost :: unordered_set e boost :: unordered_map Como meu programa começa a encher nestes recipientes eles começam a crescer maior e maior e eu queria saber se isso seria uma boa idéia para pré alocar memória para esses recipientes. algo como myMap :: get_allocator () alocar (N).; ?

ou devo deixá-los para alocar e descobrir fatores crescer em si mesmos? os códigos de olhar como este

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

   }

Agradecemos antecipadamente

Foi útil?

Solução

Gostaria de tentar as duas coisas, que permitem gerar dados concretos que mostram se um método funciona melhor do que o outro. Podemos especular durante todo o dia sobre qual método será o ideal, mas como a maioria das questões de desempenho, a melhor coisa a fazer é experimentá-lo e ver o que acontece (e, em seguida, corrigir as partes que realmente necessitam de fixação).

Dito isto, os autores do impulso parecem ser muito inteligente, por isso possivelmente vai funcionar bem como está. Você só vai ter que testar e ver.

Outras dicas

De acordo com a a documentação , tanto unordered_set e unordered_map ter um método

void rehash(size_type n);

que regenera o hashtable para que ele contenha em baldes n menos. (Parece que ele faz o que reserve() faz para contêineres STL).

Honestamente, eu acho que você seria melhor fora de escrever o seu próprio alocador. Você poderia, por exemplo, fazer um alocador com um método chamado preallocate(int N) que reservar N bytes, em seguida, usar unordered_map::get_allocator() para toda a sua diversão. Além disso, com seu próprio alocador, você poderia dizer que para agarrar grandes pedaços de cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top