Heim >Backend-Entwicklung >Golang >Wie kann ich das Lesen und Schreiben von CSV-Dateien in Go optimieren, um die Leistung zu verbessern?
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!