我目前正在編寫一個小程序,將 CSV 文件轉(zhuǎn)換為用于進(jìn)一步處理的結(jié)構(gòu)。csv 行看起來像這樣20140102,09:30,38.88,38.88,38.82,38.85,67004我有 500 個文件,每個大約 20-30 MB。我的代碼工作得很好,但我不禁想知道是否有比我現(xiàn)在正在做的更好的方法來轉(zhuǎn)換這些文件。首先讀取文件并轉(zhuǎn)換為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 來獲取我的浮點(diǎn)值。我可以做些什么來改進(jìn)這段代碼?編輯:要明確一點(diǎn),我真的不需要提高性能,我只是更好地嘗試了解 Go 以及可以應(yīng)用于此類問題的性能優(yōu)化。例如,當(dāng)我有一個字節(jié)切片并想要一個 float32 時,創(chuàng)建大量字符串和 float64 似乎有很多開銷。
1 回答

叮當(dāng)貓咪
TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊
我發(fā)現(xiàn)只有一個問題需要解決:
不要ioutil.ReadFile
與一起使用bytes.NewReader
。它將所有內(nèi)容讀入內(nèi)存,當(dāng)文件很大時效率低下。
相反,使用os.Open(file)
,它完美地提供了一個io.Reader
可以csv.NewReader
利用的。不要忘記關(guān)閉文件并處理錯誤。
如果您仍想提高性能:
由于您的 csv 文件是固定格式的,因此可以使用原始字節(jié)
bufio
代替csv
.您可以復(fù)制并粘貼底層代碼
strconv
,time
以避免不需要的通用代碼。
但我認(rèn)為他們不值得麻煩。
- 1 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報
0/150
提交
取消