Juste pour être complet, j’ai retrouvé mon benchmark.
Fichier
SERVER573,13380,3962,21165
SERVER887,20583,20666,1776
SERVER897,7849,3260,10688
SERVER420,20060,7502,27989
SERVER275,884,22932,10301
SERVER221,2203,3556,2530
SERVER882,14405,24151,20245
SERVER370,17678,12059,10055
Voir ici comment générer un tel fichier de 600000 lignes.
Imaginons que l’on cherche à additionner les chiffres de la deuxième colonne (taille RAM par exemple) pour le SERVER788.
AWK
awk -F, '
/^SERVER788/{somme += $2}
END{print somme}
' sample.csv
Go (attention c’est verbeux!)
import (
"bufio"
"fmt"
"log"
"os"
"strings"
"strconv"
)
func main() {
var somme int
file, err := os.Open("sample.csv")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
if !strings.Contains(scanner.Text(), "SERVER788") {
continue
}
lineSplit := strings.Split(scanner.Text(), ",")
s, err := strconv.Atoi(lineSplit[1])
if err != nil {
log.Println(err)
}
somme = somme + s
}
fmt.Println(somme)
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
Résultats
# awk (interprété)
$ /usr/bin/time awk -F, '/^SERVER788/{somme+=$2}END{print somme}' sample.csv
12647755
Real User Sys Cpu MaxMem
0:00.15 0.15 0.00 98% 3764
# go (compilé)
$ /usr/bin/time ./parseSample2
12647755
Real User Sys Cpu MaxMem
0:00.03 0.03 0.00 97% 6396
Edit:
Pour être tout à fait complet, j’ai également fait le test avec un code Python optimisé et avec mawk (awk super rapide utilisant un interpréteur bytecode, mais avec quelques limitations). Donc, en résumé:
awk 0.15 sec. 3764 kB
python 0.18 sec. 7160 kB
Go 0.03 sec. 6396 kB
mawk 0.04 sec. 1768 kB
On ne perd donc pas son temps à apprendre awk. Très utile pour le traitement de fichiers.