Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyelaraskan Pembacaan dan Penulisan CSV dalam Go untuk Prestasi yang Lebih Baik?

Bagaimana untuk Menyelaraskan Pembacaan dan Penulisan CSV dalam Go untuk Prestasi yang Lebih Baik?

Susan Sarandon
Susan Sarandonasal
2024-11-03 18:07:03344semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn