Le traitement efficace de fichiers volumineux est crucial pour de nombreuses applications Go. La lecture ligne par ligne, plutôt que de charger le fichier entier en mémoire, est une stratégie d’optimisation clé. Cet article détaille comment réaliser cela efficacement en utilisant la bibliothèque standard de Go, en se concentrant sur les meilleures pratiques et la gestion des erreurs.
Table des matières
- Imports de packages
- Lecture ligne par ligne avec
bufio.Scanner
- Exemple complet
- Ajustement de la taille du buffer du Scanner
- Gestion robuste des erreurs
Imports de packages
Nous utiliserons principalement le package bufio
pour les E/S tamponnées, améliorant significativement les performances par rapport à une lecture octet par octet brute. Le package os
gère les opérations sur les fichiers.
import (
"bufio"
"fmt"
"os"
)
Lecture ligne par ligne avec bufio.Scanner
bufio.Scanner
est l’outil idéal. Il lit les données par blocs, en utilisant un tampon pour l’efficacité. Sa méthode Scan()
récupère la ligne suivante, renvoyant true
en cas de succès et false
en fin de fichier.
func processFileLineByLine(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Erreur lors de l'ouverture du fichier '%s' : %vn", filePath, err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// Traiter chaque ligne (e.g., fmt.Println(line))
}
if err := scanner.Err(); err != nil {
fmt.Printf("Erreur lors de la lecture du fichier '%s' : %vn", filePath, err)
}
}
Exemple complet
Cet exemple montre comment lire et traiter les lignes d’un fichier nommé my_file.txt
. N’oubliez pas de créer ce fichier dans le même répertoire.
package main
import (
"bufio"
"fmt"
"os"
)
// ... (fonction processFileLineByLine ci-dessus) ...
func main() {
filePath := "my_file.txt"
processFileLineByLine(filePath)
}
Ajustement de la taille du buffer du Scanner
Pour les fichiers ou les lignes extrêmement volumineux, ajustez la taille du buffer de bufio.Scanner
en utilisant scanner.Buffer()
. Des buffers plus grands réduisent les appels système mais consomment plus de mémoire. Trouvez un équilibre en fonction des caractéristiques de votre fichier et des ressources disponibles.
scanner := bufio.NewScanner(file)
bufferSize := 1024 * 1024 // Buffer de 1Mo
scanner.Buffer(make([]byte, bufferSize), bufferSize)
Gestion robuste des erreurs
Vérifiez toujours les erreurs après l’ouverture du fichier et après la lecture. L’instruction defer file.Close()
garantit que le fichier est fermé même en cas d’erreur. Des messages d’erreur explicites facilitent le débogage.