亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

迄今為止的 CSV 和浮動

迄今為止的 CSV 和浮動

Go
SMILET 2023-06-05 19:44:44
我目前正在編寫一個小程序,將 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利用的。不要忘記關閉文件并處理錯誤。

如果您仍想提高性能:

  1. 由于您的 csv 文件是固定格式的,因此可以使用原始字節bufio代替csv.

  2. 您可以復制并粘貼底層代碼strconv,time以避免不需要的通用代碼。

但我認為他們不值得麻煩。


查看完整回答
反對 回復 2023-06-05
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號