Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menyelaraskan Pembacaan dan Penulisan CSV dalam Go untuk Prestasi yang Lebih Baik?
Membaca dan Menulis CSV yang Cekap dalam Go
Dalam kod Go yang disediakan, proses membaca dan menulis CSV menyebabkan isu prestasi yang ketara. Untuk menangani perkara ini, mari kita terokai pendekatan alternatif yang menyelaraskan operasi ini.
Membaca CSV dengan Cekap
Daripada memuatkan keseluruhan fail CSV ke dalam memori dan kemudian memprosesnya, kami boleh memanfaatkan csv.Keupayaan Pembaca untuk memproses satu baris pada satu masa. Ini mengurangkan penggunaan memori dengan ketara dan meningkatkan prestasi. Coretan kod berikut menunjukkan pendekatan ini:
<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>
Fungsi ini mengambil io.Reader sebagai input dan mengembalikan saluran yang menghasilkan kepingan rentetan yang mewakili rekod CSV.
Menulis CSV dengan Cekap
Begitu juga, untuk menulis CSV, kita boleh menggunakan kaedah csv.Writer untuk menulis satu baris pada satu masa untuk meningkatkan prestasi. Kod untuk penulisan CSV yang cekap sebahagian besarnya serupa dengan bacaan CSV:
<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>
Fungsi ini mengambil csv.Writer dan sekeping hirisan rentetan (mewakili data CSV) sebagai input dan menulis data secara tidak segerak ke fail CSV.
Integrasi
Dengan fungsi membaca dan menulis CSV yang dioptimumkan, logik utama program boleh ditulis semula untuk menggunakan fungsi ini untuk penambahbaikan prestasi:
<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>
Kod yang disemak ini membaca fail CSV dengan cekap dan mengira markah dengan cepat, sambil mengekalkan prestasi tinggi untuk membaca dan menulis.
Atas ialah kandungan terperinci Bagaimana untuk Menyelaraskan Pembacaan dan Penulisan CSV dalam Go untuk Prestasi yang Lebih Baik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!