Heim  >  Artikel  >  Backend-Entwicklung  >  Zwei Golang-Lösungen zum Lesen großer Dateien

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

藏色散人
藏色散人nach vorne
2021-01-04 14:23:182533Durchsuche

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
}

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
    }
}
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
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen