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中文网其他相关文章!