【发布时间】:2019-02-17 20:48:41
【问题描述】:
我目前正在编写一个小程序,它将 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 以及可以应用于此类问题的性能优化。例如,当我有一个字节切片并想要一个 float32 时,创建大量字符串和 float64 似乎需要很多开销。
【问题讨论】:
-
我认为代码不需要改进。现在需要多长时间,您希望需要多长时间?您是否已对您的程序进行了概要分析,您确定这是瓶颈所在吗?
-
我真的不需要提高速度,但是为了更好地理解go,我想尝试一下。我已经分析了应用程序,目前大部分时间都花在了 readRecord(由 readAll 调用)、time.Parse 和 parseFloat。
标签: performance go