Heim >Backend-Entwicklung >Golang >Wie kann ich das Lesen und Schreiben von CSV-Dateien in Go optimieren, um die Leistung zu verbessern?

Wie kann ich das Lesen und Schreiben von CSV-Dateien in Go optimieren, um die Leistung zu verbessern?

Susan Sarandon
Susan SarandonOriginal
2024-11-03 18:07:03404Durchsuche

How to Streamline CSV Reading and Writing in Go for Improved Performance?

Effizientes CSV-Lesen und -Schreiben in Go

Im bereitgestellten Go-Code verursacht der CSV-Lese- und -Schreibvorgang erhebliche Leistungsprobleme. Um dieses Problem zu lösen, erkunden wir einen alternativen Ansatz, der diese Vorgänge rationalisiert.

CSVs effizient lesen

Anstatt die gesamte CSV-Datei in den Speicher zu laden und sie dann zu verarbeiten, haben wir kann die Fähigkeit des csv.Readers nutzen, jeweils eine Zeile zu verarbeiten. Dadurch wird der Speicherverbrauch erheblich reduziert und die Leistung verbessert. Der folgende Codeausschnitt demonstriert diesen Ansatz:

<code class="go">func processCSV(rc io.Reader) (ch chan []string) {
    ch = make(chan []string, 10)
    go func() {
        r := csv.NewReader(rc)
        if _, err := r.Read(); err != nil { //read header
            log.Fatal(err)
        }
        defer close(ch)
        for {
            rec, err := r.Read()
            if err != nil {
                if err == io.EOF {
                    break
                }
                log.Fatal(err)

            }
            ch <- rec
        }
    }()
    return
}</code>

Diese Funktion verwendet einen io.Reader als Eingabe und gibt einen Kanal zurück, der Zeichenfolgenabschnitte liefert, die die CSV-Datensätze darstellen.

Schreiben CSVs effizient erstellen

Ähnlich können wir zum Schreiben von CSVs die Methode des csv.Writer verwenden, um jeweils eine Zeile zu schreiben, um die Leistung zu verbessern. Der Code für effizientes CSV-Schreiben ähnelt weitgehend dem CSV-Lesen:

<code class="go">func writeCSV(wc *csv.Writer, data [][]string) {
    go func() {
        defer wc.Flush(nil)
        for _, rec := range data {
            if err := wc.Write(rec); err != nil {
                log.Fatal(err)
            }
        }
    }()
}</code>

Diese Funktion verwendet einen csv.Writer und einen Abschnitt von Zeichenfolgenabschnitten (die die CSV-Daten darstellen) als Eingaben und schreibt die Daten asynchron in die CSV-Datei.

Integration

Mit den optimierten CSV-Lese- und Schreibfunktionen kann die Hauptlogik des Programms neu geschrieben werden, um diese Funktionen für eine verbesserte Nutzung zu nutzen Leistung:

<code class="go">func main() {
    recordsCh := processCSV(os.Open("./path/to/datafile.csv"))
    outfile, err := os.Create("./where/to/write/resultsfile.csv"))
    if err != nil {
        log.Fatal("Unable to open output")
    }
    defer outfile.Close()
    writer := csv.NewWriter(outfile)
    writer.Write([]string{"time", "value", "score"})
    for record := range recordsCh {
        time := record[0]
        value := record[1]
        
        // calculate scores; THIS EXTERNAL METHOD CANNOT BE CHANGED
        score := calculateStuff(value)
        
        valueString := strconv.FormatFloat(floatValue, 'f', 8, 64)
        scoreString := strconv.FormatFloat(prob, 'f', 8, 64)
        writer.Write([]string{time, valueString, scoreString})
    }
    writer.Flush()
}</code>

Dieser überarbeitete Code liest die CSV-Datei effizient und berechnet Ergebnisse im Handumdrehen, während gleichzeitig eine hohe Leistung sowohl beim Lesen als auch beim Schreiben erhalten bleibt.

Das obige ist der detaillierte Inhalt vonWie kann ich das Lesen und Schreiben von CSV-Dateien in Go optimieren, um die Leistung zu verbessern?. 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