Zwei Golang-Lösungen zum Lesen großer Dateien

藏色散人
Freigeben: 2021-01-04 14:23:18
nach vorne
2558 Leute haben es durchsucht

Die folgende Golang-Tutorial-Kolumne stellt Ihnen zwei Lösungen zum Lesen sehr großer Dateien in Golang vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Zwei Golang-Lösungen zum Lesen großer Dateien

Zwei Lösungen zum Lesen sehr großer Dateien in Golang

1. Stream-Verarbeitung

Im letzten Interview wurde ich gefragt, wie Sie mit sehr großen Dateien umgehen? Damals stimmte es, ich habe nicht viel darüber nachgedacht. Nachdem ich zurückgekommen war, habe ich dieses Problem sorgfältig untersucht und eine Analyse des Lesens großer Dateien durchgeführt. Wir haben beispielsweise eine Protokolldatei, die seit mehreren Jahren läuft und ist 100G groß. Gemäß unserer vorherigen Operation könnte der Code so geschrieben sein:

func ReadFile(filePath string) []byte{
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Println("Read error")
    }
    return content
}
Nach dem Login kopieren

Der obige Code kann eine Datei mit mehreren Megabyte lesen, aber wenn sie größer als Sie selbst und ihr Speicher ist, stürzt sie direkt ab. Denn der obige Code liest den gesamten Inhalt der Datei in den Speicher und gibt ihn dann zurück. Wenn Sie eine Datei mit mehreren Megabyte haben, ist Ihr Speicher groß genug, um sie zu verarbeiten, aber sobald die Datei Hunderte von Megabyte groß ist, ist dies nicht mehr der Fall so einfach zu verarbeiten. Dann gibt es zwei richtige Methoden. Der Code lautet wie folgt:

func ReadFile(filePath string, handle func(string)) error {
    f, err := os.Open(filePath)
    defer f.Close()
    if err != nil {
        return err
    }
    buf := bufio.NewReader(f)

    for {
        line, err := buf.ReadLine("\n")
        line = strings.TrimSpace(line)
        handle(line)
        if err != nil {
            if err == io.EOF{
                return nil
            }
            return err
        }
        return nil
    }
}
Nach dem Login kopieren
Die zweite Lösung ist die Shard-Verarbeitung und es gibt kein Zeilenumbruchzeichen Die gleiche Lösung für den Umgang mit großen Dateien

func ReadBigFile(fileName string, handle func([]byte)) error {
    f, err := os.Open(fileName)
    if err != nil {
        fmt.Println("can't opened this file")
        return err
    }
    defer f.Close()
    s := make([]byte, 4096)
    for {
        switch nr, err := f.Read(s[:]); true {
        case nr < 0:
            fmt.Fprintf(os.Stderr, "cat: error reading: %s\n
Nach dem Login kopieren
Weitere verwandte technische Artikel finden Sie in der Spalte „Go Language Tutorial“!

Das obige ist der detaillierte Inhalt vonZwei Golang-Lösungen zum Lesen großer Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
go
Quelle:csdn.net
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage