O processamento eficiente de arquivos grandes é crucial para muitas aplicações Go. Ler linha por linha, em vez de carregar o arquivo inteiro na memória, é uma estratégia de otimização chave. Este artigo detalha como alcançar isso eficientemente usando a biblioteca padrão do Go, focando em melhores práticas e tratamento de erros.
Sumário
- Importação de Pacotes
- Leitura Linha por Linha com
bufio.Scanner
- Exemplo Completo
- Ajustando o Tamanho do Buffer do Scanner
- Tratamento Robusto de Erros
Importação de Pacotes
Usaremos principalmente o pacote bufio
para E/S com buffer, melhorando significativamente o desempenho em relação à leitura bruta byte a byte. O pacote os
lida com operações de arquivo.
import (
"bufio"
"fmt"
"os"
)
Leitura Linha por Linha com bufio.Scanner
O bufio.Scanner
é a ferramenta ideal. Ele lê dados em blocos, utilizando buffer para eficiência. Seu método Scan()
recupera a próxima linha, retornando true
em caso de sucesso e false
no final do arquivo.
func processFileLineByLine(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Erro ao abrir o arquivo '%s': %vn", filePath, err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// Processa cada linha (e.g., fmt.Println(line))
}
if err := scanner.Err(); err != nil {
fmt.Printf("Erro ao ler o arquivo '%s': %vn", filePath, err)
}
}
Exemplo Completo
Este exemplo demonstra a leitura e o processamento de linhas de um arquivo chamado my_file.txt
. Lembre-se de criar este arquivo no mesmo diretório.
package main
import (
"bufio"
"fmt"
"os"
)
// ... (função processFileLineByLine de cima) ...
func main() {
filePath := "my_file.txt"
processFileLineByLine(filePath)
}
Ajustando o Tamanho do Buffer do Scanner
Para arquivos ou linhas extremamente grandes, ajuste o tamanho do buffer do bufio.Scanner
usando scanner.Buffer()
. Buffers maiores reduzem chamadas ao sistema, mas consomem mais memória. Encontre um equilíbrio com base nas características do seu arquivo e nos recursos disponíveis.
scanner := bufio.NewScanner(file)
bufferSize := 1024 * 1024 // Buffer de 1MB
scanner.Buffer(make([]byte, bufferSize), bufferSize)
Tratamento Robusto de Erros
Sempre verifique se há erros após abrir o arquivo e após a varredura. A instrução defer file.Close()
garante que o arquivo seja fechado mesmo que ocorram erros. Mensagens de erro informativas ajudam na depuração.