Bonjour,
un premier point est que cette regex:
if($ligne =~ /^(.*)\t(.*)$/)
est a priori très inefficace car elle fait beaucoup de retours arrière (backtracking). Essaie plutôt:
if($ligne =~ /^(.*?)\t(.*)$/)
ou
if($ligne =~ /^([^\t]*)\t(.*)$/)
La lecture du premier fichier devrait être significativement plus rapide. Fais éventuellement un test sur la seule lecture du premier fichier pour vérifier.
Point accessoire: je ne comprends pas d'où vient $3 dans ta regex (il n'y a que deux paires de parenthèses capturantes).
Cela dit, c'est sans doute surtout la deuxième partie de ton programme qui prend beaucoup de temps, avec sa triple boucle imbriquée. Je suis persuadé que l'on peut faire beaucoup beaucoup mieux en modifiant l'algo, mais je n'ai pas le temps de me pencher en détail dessus maintenant.
Au minimum, faire ceci:
my @list = split "\t",$t;
pour chaque ligne du fichier 2 en entrée est très inefficace, il faut ne le faire qu'une seule fois avant d'attaquer le fichier 2, en utilisant un hash de tableaux, par exemple.
Mais, comme je l'ai dit, je pense surtout qu'il faut réviser l'algo de fond en comble pour éviter cette triple boucle. Mais là, je ne peux te conseiller maintenant , il me faudrait du temps pour comprendre exactement ce que tu fais dans ton programme et trouver une meilleure solution, je suis pratiquement sûr qu'il y en a une, mais je n'ai pas le temps maintenant. J’essaierai de revenir plus tard.
Entre temps, si tu peux fournir des données en entrée plus conséquentes (au moins quelques centaines de lignes pour chaque fichier) dans des fichiers attachés, cela permettrait de mieux comprendre ton besoin et de tester des solutions alternatives.
Partager