首页 > 后端开发 > Golang > 如何简化 Go 中的 CSV 读写以提高性能?

如何简化 Go 中的 CSV 读写以提高性能?

Susan Sarandon
发布: 2024-11-03 18:07:03
原创
460 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板