performance - 迄今为止的 CSV 和 float

标签 performance go

我目前正在编写一个小程序,将 CSV 文件转换为用于进一步处理的结构。 csv 行看起来像这样

20140102,09:30,38.88,38.88,38.82,38.85,67004

我有 500 个文件,每个大约 20-30 MB。 我的代码工作得很好,但我不禁想知道是否有比我现在正在做的更好的方法来转换这些文件。 先读取文件并转为csv记录(伪代码)

    data, err := ioutil.ReadFile(path)
    if err != nil {
        ... 
    }
    r := csv.NewReader(bytes.NewReader(data))
    records, err := r.ReadAll()
    if err != nil {
        ... 
    }

然后遍历所有记录并做

    parsedTime, err := time.Parse("2006010215:04", record[0]+record[1])
    if err != nil {
        return model.ZorroT6{}, time.Time{}, err
    }

    t6.Date = ConvertToOle(parsedTime)
    if open, err := strconv.ParseFloat(record[2], 32); err == nil {
        t6.Open = float32(open)
    }
    if high, err := strconv.ParseFloat(record[3], 32); err == nil {
        t6.High = float32(high)
    }
    if low, err := strconv.ParseFloat(record[4], 32); err == nil {
        t6.Low = float32(low)
    }
    if close, err := strconv.ParseFloat(record[5], 32); err == nil {
        t6.Close = float32(close)
    }
    if vol, err := strconv.ParseInt(record[6], 10,32); err == nil {
        t6.Vol = int32(vol)
    }

例如,我必须通过 []byte -> string -> float64 -> float32 来获取我的浮点值。我可以做些什么来改进这段代码?

编辑:需要说明的是,我并不是真的需要提高性能,我只是更好地尝试理解 Go 以及可以应用于此类问题的性能优化。例如,当我有一个字节 slice 并想要一个 float32 时,创建大量字符串和 float64 似乎有很多开销。

最佳答案

我发现只有一个问题需要解决:

不要将 ioutil.ReadFilebytes.NewReader 一起使用。它将所有内容读入内存,当文件很大时效率低下。

相反,使用os.Open(file),它完美地提供了csv.NewReader 可以使用的io.Reader。不要忘记关闭文件并处理错误。

如果你还想提高性能:

  1. 由于您的 csv 文件是固定格式的,因此可以使用 bufio 提供的原始字节代替 csv

    <
  2. 您可以在 strconvtime 中复制并粘贴底层代码,以避免出现不需要的通用代码。

但我认为他们不值得麻烦。

关于performance - 迄今为止的 CSV 和 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737553/

相关文章:

php - 如何最好地将元素添加到 PHP 中任意索引处的数组?

mysql - 在循环中运行 SQL count(*) 查询或尝试将其合并到父查询中是否更快?

Java合并数组列表很慢

Javascript: 'splice' 的算法性能如何?

Java 与 Python 特定的代码片段性能改进

http - 如何使用 gorequest 发起 POST 请求

SQL插入接口(interface) slice

arrays - 如何将json对象的json数组合并到单个json对象

go - 急忙:没有规范可解码

go - 删除 slice 的元素修改原始值