Lecture incrémentielle des dernières lignes d'un fichier volumineux dans Go
Dans ce scénario, nous visons à lire les deux dernières lignes d'un gros journal fichier sans le charger en mémoire et en répétant ce processus toutes les 10 secondes.
Dans l'extrait de code Go fourni :
package main import ( "fmt" "time" "os" ) const MYFILE = "logfile.log" func main() { c := time.Tick(10 * time.Second) for now := range c { readFile(MYFILE) } } func readFile(fname string){ file, err:=os.Open(fname) if err!=nil{ panic(err) }
Nous pouvons améliorer ses fonctionnalités pour atteindre notre objectif en exploitant le fichier. Méthode Stat pour déterminer la taille du fichier et la méthode file.ReadAt pour lire les données à partir d'un décalage d'octet spécifique dans le fichier.
import ( "fmt" "os" "time" ) const MYFILE = "logfile.log" func main() { c := time.Tick(10 * time.Second) for _ = range c { readFile(MYFILE) } } func readFile(fname string) { file, err := os.Open(fname) if err != nil { panic(err) } defer file.Close() // Determine the size of the file stat, statErr := file.Stat() if statErr != nil { panic(statErr) } fileSize := stat.Size() // Assuming you know the size of each line in bytes (e.g., 62) start := fileSize - (62 * 2) // Read the last two lines from the file buf := make([]byte, 62 * 2) _, err = file.ReadAt(buf, start) if err == nil { fmt.Printf("%s\n", buf) } }
En utilisant les informations sur la taille du fichier et la lecture directe du décalage d'octet, nous pouvons lire efficacement le deux dernières lignes du fichier sans le charger entièrement en mémoire et répétez ce processus toutes les 10 secondes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!