Pregunta

Yo estaré análisis sintáctico de 60 GB de texto y haciendo un montón de inserción y las búsquedas en mapas. Acabo de empezar a usar boost :: unordered_set e impulsar :: unordered_map Como mi programa empieza a llenar en estos contenedores que empiezan a crecer más y más grande y me preguntaba si esto sería una buena idea de comprobar la validez asignar memoria para estos contenedores. algo como     myMap :: get_allocator () asignar (N).; ?

o debería dejarlas para asignar y averiguar crecer factores por sí mismos? los códigos se parecen a esto

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

   }

Gracias de antemano

¿Fue útil?

Solución

Me gustaría probar las dos cosas, lo que le permitirá generar datos duros que muestra que un método funciona mejor que el otro. Podemos especular todo el día acerca de qué método será el óptimo, pero como con la mayoría de preguntas de desempeño, lo mejor que puede hacer es probarlo y ver qué pasa (y luego fijar las piezas que realmente hay que arreglar).

Dicho esto, los autores Boost parecen ser muy inteligente, por lo que muy posiblemente no tendrán ningún problema tal como está. Usted sólo tiene que probar y ver.

Otros consejos

De acuerdo con la documentación , tanto unordered_set y unordered_map tienen un método

void rehash(size_type n);

que regenera la tabla hash para que contenga, al menos, cubos n. (Suena como lo hace lo que hace reserve() para contenedores STL).

Sinceramente, creo que estaría mejor fuera de la escritura de su propio asignador. Se podría, por ejemplo, hacer un asignador con un método llamado preallocate(int N) que reservar N bytes, a continuación, utilizar unordered_map::get_allocator() para toda su diversión. Además, con su propio asignador, se veía que para agarrar enormes trozos a la vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top