la optimización de impulso mapa y conjuntos desordenada, C ++
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
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.