Question

Je vais analyse 60Go du texte et faire beaucoup d'insertion et dans les cartes lookups. Je viens de commencer à utiliser boost :: unordered_set et boost :: unordered_map Comme mon programme commence à remplir dans ces conteneurs, ils commencent de plus en plus grand et plus gros et je me demandais si ce serait une bonne idée de pré allouer de la mémoire pour ces conteneurs. quelque chose comme     MyMap :: get_allocator () allouer (N). ?

ou devrais-je les laisser allouer et de déterminer les facteurs eux-mêmes se développer? les codes ressemblent à ceci

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

   }

Merci d'avance

Était-ce utile?

La solution

J'expérimentez, qui vous permettra de générer des données précises indiquant si une méthode fonctionne mieux que l'autre. Nous pouvons spéculer toute la journée sur la méthode sera optimale, mais comme la plupart des questions de performance, la meilleure chose à faire est d'essayer et voir ce qui se passe (et fixer les pièces qui en fait besoin de fixation).

Cela étant dit, les auteurs de Boost semblent être très intelligent, il très probablement fonctionnera très bien en l'état. Vous aurez juste à tester et voir.

Autres conseils

Selon la documentation , les deux unordered_set et unordered_map ont une méthode

void rehash(size_type n);

qui régénère la Hashtable pour qu'il contienne au moins des seaux de n. (On dirait qu'il fait ce reserve() fait pour conteneurs STL).

Honnêtement, je pense que vous seriez mieux loti écrire votre propre allocateur. Vous pouvez, par exemple, faire un allocateur avec une méthode appelée preallocate(int N) qui réserverait N octets, puis utilisez unordered_map::get_allocator() pour tout votre plaisir. De plus, avec votre propre allocateur, vous pouvez le dire à saisir d'énormes morceaux à la fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top