Bonjour,
Alors j'aimerais indexer dans une hashMap tout plein de k-mer de plusieurs millions de mots différents.
J'utilise l'extension de la hashMap développée par SGI pour répondre à ce problème.
Voici mon code :
Le problème est que c'est très très lent !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 ----> inclusion de l'extension SGI #include <ext/hash_map> using namespace std; namespace std { using namespace __gnu_cxx; } ----> utilisation du hasher proposé par SGI struct eqstr{ bool operator()(const char* s1, const char* s2) const { return strcmp(s1,s2)==0; } }; -----> le block associé à la hash int main(int argc, char **argv) { // initialisation hash_map<const char*, int, hash<const char*>, eqstr> hash_kmer; ... ... ullong cpt = 0; uint lg_kmer = k; // k une longueur fixe, plus petite que la taille du plus petit mot... while (cpt < nb_mots) { tousLesMots.getline(mot_actuel, lg_mot+1); for (ullong i = 0 ; i < (lg_mot-lg_kmer) ; i++){ facteur = (mot_actuel.substr(i,lg_kmer)).c_str(); hash_kmer[facteur] ++ ; } cpt++; } ... ... return 0; }
Par exemple, en prenant des mots de longueurs 75 et un k-mer de longueur 22, pour un nombre de mots de 45 millions, il faut 8 heures pour faire tourner le programme (sur une machine puissante).
Au début, je pensais que c'était la gestion des collisions qui prenait beaucoup de temps. De ce fait, j'ai diminué la longueur de k pour avoir moins de collisions. Sauf que, pour le même exemple, mais avec un k de longueur 10 ça met 15 heures, donc deux fois plus de temps.
Je pense que c'est mon implantation qui n'est pas bonne (ou peut-être le hasher que j'utilise). C'est pour cela que je me retourne vers vous car je ne suis pas plus compétant que ça dans les hashMap.
PS : j'ai testé d'autres implantation de hash telles que google-sparse ou google-dense mais ça ne change rien.
De plus dans ce comparatif, SGI n'est pas trop mal située :
http://attractivechaos.awardspace.com/udb.html
Qui aurait une idée de ce problème de lenteur ????
Merci d'avance,
Nicolas P
Partager