Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich alle 10 Sekunden effizient die letzten Zeilen einer großen Datei in Go lesen?

Wie kann ich alle 10 Sekunden effizient die letzten Zeilen einer großen Datei in Go lesen?

DDD
DDDOriginal
2024-11-07 11:43:03934Durchsuche

How to Efficiently Read the Last Lines from a Large File in Go Every 10 Seconds?

So lesen Sie die letzten Zeilen einer großen Datei mit Go alle 10 Sekunden

Herausforderung: Lesen der letzten beiden Zeilen einer großen Protokolldatei ohne die gesamte Datei in den Speicher zu laden, diesen Vorgang alle 10 Sekunden wiederholen.

Lösung: Seek oder ReadAt und Stat verwenden

Stat-Funktion: Um das Laden der gesamten Datei zu vermeiden In den Speicher kann die Länge der Datei mithilfe der Funktion Stat() des Betriebssystempakets ermittelt werden. Dies gibt die Dateigröße in Bytes an.

Suchen oder Vorlesen:

  • Seek() kann verwendet werden, um den Dateizeiger an die entsprechende Stelle zu verschieben. Das Vorlesen einer bestimmten Anzahl von Bytes von dieser Position aus ruft die gewünschten Zeilen ab.
  • Alternativ kann die ReadAt()-Funktion verwendet werden, um eine bestimmte Anzahl von Bytes beginnend an einer bestimmten Position zu lesen.

Betrachten Sie das Beispiel in Ihrer Frage:

Code-Snippet:

package main

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()

    buf := make([]byte, 62)
    stat, statErr := file.Stat()
    if statErr != nil {
        panic(statErr)
    }
    start := stat.Size() - 62
    _, err = file.ReadAt(buf, start)
    if err == nil {
        fmt.Printf("%s\n", buf)
    }

}

In diesem Beispiel:

  • The Die Funktion Stat() wird verwendet, um die Dateigröße zu ermitteln.
  • ReadAt() wird verwendet, um 62 Bytes beginnend an einer bestimmten Position zu lesen (Dateigröße - 62).
  • Die letzten beiden Zeilen von Die als Bytes gespeicherte Protokolldatei wird dann gedruckt.

Das obige ist der detaillierte Inhalt vonWie kann ich alle 10 Sekunden effizient die letzten Zeilen einer großen Datei in Go lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn