首頁  >  文章  >  後端開發  >  如何在 Go 中高效處理大型 CSV 檔案?

如何在 Go 中高效處理大型 CSV 檔案?

Patricia Arquette
Patricia Arquette原創
2024-11-03 04:49:30520瀏覽

How to Efficiently Process Large CSV Files in Go?

Go 中高效讀寫CSV 資料

提供的Go 程式碼讀取包含10,000 條記錄的大型CSV 文件,執行計算,並然後將原始值寫入另一個帶有附加分數列的CSV。然而,這個過程很慢,需要幾個小時才能完成。本文研究了 CSV 讀寫操作中潛在的低效率問題,以最佳化程式碼。

一個關鍵的最佳化是避免一次將整個檔案載入記憶體。原始程式碼使用ReadAll()將所有記錄讀取到一個切片中,這對於大檔案來說效率不高。相反,首選流式處理方法,即一次處理一行檔案。

為了實現這一點,我們可以使用 goroutine 逐行讀取 CSV 檔案並將記錄傳送到通道。主 Goroutine 可以使用來自通道的記錄,執行計算,並將結果寫入輸出 CSV。以下是一個範例實作:

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

在此程式碼中,processCSV() 函數採用讀取器並傳回從 CSV 檔案發出記錄的通道。然後主協程可以使用這個通道來有效率地處理和寫入記錄。

透過使用這種串流處理方法,我們可以顯著提高 CSV 讀寫操作的效能,使程式碼更有效地處理大型資料。 CSV 檔案。

以上是如何在 Go 中高效處理大型 CSV 檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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