- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我目前正在编写一个小程序,将 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.ReadFile
与 bytes.NewReader
一起使用。它将所有内容读入内存,当文件很大时效率低下。
相反,使用os.Open(file)
,它完美地提供了csv.NewReader
可以使用的io.Reader
。不要忘记关闭文件并处理错误。
如果你还想提高性能:
由于您的 csv 文件是固定格式的,因此可以使用 bufio
提供的原始字节代替 csv
。
您可以在 strconv
和 time
中复制并粘贴底层代码,以避免出现不需要的通用代码。
但我认为他们不值得麻烦。
关于performance - 迄今为止的 CSV 和 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737553/
我在将一列转换为日期时遇到一些问题。 我希望将'01/02/98'(日、月、年)转换为'1998-02-01'(年、月、日). 以及如何将 '98' 转换为 1998。 最佳答案 I want thi
我正在从旧系统转换许多晦涩的日期格式。日期作为字符串解包/处理并转换为 ISO 8601 格式。 这个特定的函数尝试将 YYMMDD0F 转换为 YYYYMMDD ——函数名称说明了一切。从 2000
我是一名优秀的程序员,十分优秀!