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中文網其他相關文章!