以CSV格式显示并浮动

时间:2019-02-17 20:48:42

标签: 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来获取我的float值。我该怎么做才能改善这段代码?

编辑:为清楚起见,我并不是真的需要来提高性能,我只是更好地理解了Go以及可以对此类问题进行何种性能优化。例如,当我有一个字节片并需要一个float32时,创建字符串和float64的负载似乎会产生很多开销。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您仍然想提高性能:

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

  2. 您可以将基础代码复制并粘贴到strconvtime中,以避免不需要的常规代码。

但是我认为他们不值得为此烦恼。