Go Programming

Lectura eficiente de archivos línea por línea en Go

Spread the love

Procesar eficientemente archivos grandes es crucial para muchas aplicaciones Go. Leer línea por línea, en lugar de cargar todo el archivo en memoria, es una estrategia de optimización clave. Este artículo detalla cómo lograr esto eficientemente usando la biblioteca estándar de Go, enfocándose en las mejores prácticas y el manejo de errores.

Tabla de Contenido

Importaciones de Paquetes

Usaremos principalmente el paquete bufio para E/S con buffer, mejorando significativamente el rendimiento en comparación con la lectura de byte a byte sin buffer. El paquete os maneja las operaciones de archivos.


import (
	"bufio"
	"fmt"
	"os"
)

Lectura Línea por Línea con bufio.Scanner

bufio.Scanner es la herramienta ideal. Lee datos en bloques, utilizando un buffer para mayor eficiencia. Su método Scan() recupera la siguiente línea, devolviendo true si tiene éxito y false al final del archivo.


func procesarArchivoLineaPorLinea(rutaArchivo string) {
	archivo, err := os.Open(rutaArchivo)
	if err != nil {
		fmt.Printf("Error al abrir el archivo '%s': %vn", rutaArchivo, err)
		return
	}
	defer archivo.Close()

	scanner := bufio.NewScanner(archivo)
	for scanner.Scan() {
		linea := scanner.Text()
		// Procesar cada línea (e.g., fmt.Println(linea))
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("Error al leer el archivo '%s': %vn", rutaArchivo, err)
	}
}

Ejemplo Completo

Este ejemplo demuestra cómo leer y procesar líneas de un archivo llamado my_file.txt. Recuerda crear este archivo en el mismo directorio.


package main

import (
	"bufio"
	"fmt"
	"os"
)

// ... (función procesarArchivoLineaPorLinea de arriba) ...

func main() {
	rutaArchivo := "my_file.txt"
	procesarArchivoLineaPorLinea(rutaArchivo)
}

Ajustando el Tamaño del Buffer del Scanner

Para archivos o líneas extremadamente grandes, ajusta el tamaño del buffer de bufio.Scanner usando scanner.Buffer(). Buffers más grandes reducen las llamadas al sistema pero consumen más memoria. Encuentra un equilibrio basado en las características de tu archivo y los recursos disponibles.


scanner := bufio.NewScanner(archivo)
tamanoBuffer := 1024 * 1024 // Buffer de 1MB
scanner.Buffer(make([]byte, tamanoBuffer), tamanoBuffer)

Manejo Robusto de Errores

Siempre verifica si hay errores después de abrir el archivo y después de escanear. La sentencia defer archivo.Close() asegura que el archivo se cierre incluso si ocurren errores. Los mensajes de error informativos ayudan con la depuración.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *