Bonjour,
Je ne suis pas sûr de bien avoir saisi ton problème, mais à première vue (et vu les tailles envisagées), tu pourrais :
- charger ton ancien dictionnaire en mémoire (dans une table de hash, par exemple) :
my %hash = ();
...
$hash{$mot} = undef;
- charger dans la même table de hash, le dictionnaire que tu veux merger :
Le mécanisme de table de hash garantit l'unicité des clés, donc des entrées du dictionnaire.
Ensuite, quelque chose comme :
foreach (sort { $a cmp $b } (keys %hash)) {
print NEWDICO ("$_\n");
}
ce qui devrait te trier au passage ton nouveau fichier.
Je n'ai rien testé et c'est brut de décoffrage, mais je pense que cela coûte grosso modo le temps de lecture des fichiers de départ (une fois chacun), le temps d'écriture du fichier résultat, et bien sûr le temps de trier une liste de 50M éléments (aucune idée de ce que cela représente en Perl), c'est-à-dire de l'ordre de quelques minutes. Je veux bien un retour sur ce point
Pour parler de performances que je maîtrise mieux, je suis quasiment certain qu'un programme C utilisant qsort (quitte à passer un peu de temps à virer les entrées doubles après le tri au moment de l'écriture) remplit ce rôle en moins de 5 minutes.
Dans tous les cas, 2 heures pour faire ça me semble astronomique.
Petite remarque : la puissance de Perl permet de faire le tri avec à peu près n'importe quoi, on peut imaginer utiliser dans le foreach :
sort { length($a) <=> length($b) } (keys %hash) # pour faire le tri sur la longueur des chaînes
sort { comparison_function() } (keys %hash) # pour appeler une fonction de comparaison maison (on peut toujours "inliner" le code à la main si on s'en sent le courage
Une fois le fichier trié, la recherche d'un mot par dichotomie est quasi instantanée si le fichier est en RAM (pour 30 M de lignes, il faut au pire 25 essais). Si les fichiers ne tiennent pas en RAM, il faut en effet commencer à ruser en les découpant suivant la première lettre, les 2 premières lettres, ou utiliser des fonctions de hashages de faible entropie (8 bits, par exemple). La dernière solution est fun, mais ça ne simplifie pas du tout l'élaboration des dictionnaires.
Bref, tout ça pour dire que je ne suis pas certain d'avoir fait avancer le schimilibilillick.