我目前正在編寫一個小程序,將 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 似乎有很多開銷。
1 回答

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