Go Programming

Lecture efficace de fichier ligne par ligne en Go

Spread the love

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

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *