Bonjour,
Je cherche à améliorer un script shell pour qu'il soit plus rapide (actuellement il met entre 10 et 45 minutes pour tourner). C'est la commande grep qui fait perdre le plus de temps (car les fichiers sont très gros)
Donc je viens de faire des tests avec le fichier "fichier_test" qui ne fait que 16700 lignes (c'est loin de la taille des fichiers réels)
J'utilisais la commande suivante pour ne récupérer que les lignes ne commençant pas par un chiffre et ne faisant que 11 caractères :
Comme finalement les lignes commencent normalement par une lettre j'ai testé cette commande (c'est beaucoup mieux)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time grep -v ^[0-9] fichier_test | grep ^...........$ real 0m16.276s user 0m16.239s sys 0m0.030s
J'ai aussi testé un grep équivalent sans ignorer la casse (gain de 0.3 secondes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time grep -i ^[a-z] fichier_test | grep ^...........$ real 0m4.818s user 0m4.789s sys 0m0.046s
Ou simplement les lignes de 11 caractères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time grep ^[A-Za-z] fichier_test | grep ^...........$ real 0m4.553s user 0m4.539s sys 0m0.030s
J'ai aussi testé en recherchant directement les lignes commençant par le résultat des tests. Je passe alors de plus de 4,5 secondes à 0,1 seconde
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time grep ^...........$ fichier_test real 0m4.618s user 0m4.617s sys 0m0.015s
J'ai donc testé la recherche d'une ligne commençant par une lettre en les listant toutes. C'est ce qui me donne le résultat le plus performant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time grep -E "^ABCD|^EFGH" fichier_test | grep ^...........$ real 0m0.100s user 0m0.123s sys 0m0.015s
Pourquoi il y a-t-il temps de différence entre ces différentes commandes ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 grep -E "^A|^B|^C|^D|^E|^F|^G|^H|^I|^J|^K|^L|^M|^N|^O|^P|^Q|^R|^S|^T|^U|^V|^W|^X|^Y|^Z|^a|^b|^c|^d|^e|^f|^g|^h|^i|^j|^k|^l|^m|^n|^o|^p|^q|^r|^s|^t|^u|^v|^w|^x|^y|^z" fichier_test | grep ^...........$ real 0m0.108s user 0m0.108s sys 0m0.030s
Au final, je pense partir sur la commande sed :
Elle semble légèrement plus rapide que la commande awk
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time sed -n '/^...........$/p' fichier_test real 0m0.106s user 0m0.078s sys 0m0.030s
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 time awk '/^...........$/ { print }' fichier_test real 0m0.110s user 0m0.093s sys 0m0.030s
ps: en tout cas, ça va faire un gros coup de boost dans les performances du scripts (16 secondes => 0,1 secondes pour un "petit" fichier).
Partager