首頁 >後端開發 >Golang >如何簡化 Go 中的 CSV 讀寫以提高效能?

如何簡化 Go 中的 CSV 讀寫以提高效能?

Susan Sarandon
Susan Sarandon原創
2024-11-03 18:07:03460瀏覽

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

Go 中高效的 CSV 讀寫

在提供的 Go 程式碼中,CSV 讀取過程導致了嚴重的效能問題。為了解決這個問題,讓我們來探索一種簡化這些操作的替代方法。

高效讀取CSV

我們不是將整個CSV 檔案載入到記憶體中然後對其進行處理,而是可以利用csv.Reader 一次處理一行的能力。這顯著減少了記憶體使用並提高了效能。以下程式碼片段示範了這種方法:

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

此函數採用 io.Reader 作為輸入,並傳回一個通道,該通道產生表示 CSV 記錄的字串切片。

寫入高效率的 CSV

同樣,對於寫入 CSV,我們可以使用 csv.Writer 一次寫入一行的方法來提高效能。高效CSV 寫入的程式碼在很大程度上類似於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>

該函數採用csv.Writer 和字串切片(代表CSV 資料)作為輸入並非同步寫入資料

整合

優化了CSV讀寫功能,可以重寫程式的主要邏輯,使用這些功能來提高效能效能:

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

修改後的程式碼可以有效地讀取CSV 檔案並動態計算分數,同時保持讀寫的高效能。

以上是如何簡化 Go 中的 CSV 讀寫以提高效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn