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

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

Golang 讀取 csv 在內存中消耗的空間是磁盤空間的 2 倍以上

Golang 讀取 csv 在內存中消耗的空間是磁盤空間的 2 倍以上

Go
喵喔喔 2022-06-27 15:06:36
我正在使用 Golang 將大量 CSV 文件加載到結構中。結構是type csvData struct {    Index   []time.Time    Columns map[string][]float64}    我有一個解析器,它使用:csv.NewReader(file).ReadAll()然后我遍歷行,并將值轉換為它們的類型:time.Time或float64.問題是這些文件在磁盤上占用 5GB 空間。一旦我將它們加載到內存中,它們就會消耗 12GB!我使用ioutil.ReadFile(path)并發現這與預期的一樣幾乎完全是磁盤上的大小。這是我的解析器的代碼,為了便于閱讀,省略了錯誤,如果你能幫助我排除故障:var inMemoryRepo = make([]csvData, 0)func LoadCSVIntoMemory(path string) {    parsedData := csvData{make([]time.Time, 0), make(map[string][]float64)}    file, _ := os.Open(path)    reader := csv.NewReader(file)    columnNames := reader.Read()    columnData := reader.ReadAll()    for _, row := range columnData {        parsedData.Index = append(parsedData.Index, parseTime(row[0])) //parseTime is a simple wrapper for time.Parse        for i := range row[1:] {                                       //parse non-index numeric columns            parsedData.Columns[columnNames[i]] = append(parsedData.Columns[columnsNames[i]], parseFloat(columnData[i])) //parseFloat is wrapper for strconv.ParseFloat        }    }    inMemoryRepo = append(inMemoryRepo, parsedData)}我嘗試通過在函數調用結束時將columnData和設置為零來進行故障排除,但沒有任何變化。reader
查看完整描述

2 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

這沒有什么令人驚訝的。在您的磁盤上只有 CSV 文本的字符(字節)。當您將它們加載到內存中時,您會從文本中創建數據結構。

例如,一個float64值在內存中需要 64 位,即:8 個字節。如果您有輸入 text "1",則為 1 個單字節。然而,如果你創建一個float64等于 的值1,那仍然會消耗 8 個字節。

此外,strings 存儲有一個字符串頭 ( reflect.StringHeader),它是 2 個整數值(在 64 位架構上為 16 個字節),并且該頭指向實際的字符串數據。有關詳細信息,請參閱Golang中的字符串內存使用情況。

切片也是類似的數據結構:reflect.SliceHeader. 標頭由 3 個整數值組成,即使切片中沒有元素,在 64 位架構上也是 24 個字節。

在此之上的結構可能具有填充(字段必須與某些值對齊),這再次增加了開銷。有關詳細信息,請參閱規格:尺寸和對齊保證。

Go Maps 是 hashmaps,它也有相當多的開銷,有關詳細信息,請參閱為什么切片值有時會過時但從不映射值?,對于內存使用情況,請參閱Golang maps 保留多少內存?


查看完整回答
反對 回復 2022-06-27
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

很少將整個文件讀入內存是一個好主意。


如果你的 csv 是 100GiB 怎么辦?


如果您的轉換不涉及多個記錄,也許您可以應用以下算法:


open csv_reader (source file)

open csv_writer (destination file)

for row in csv_reader

    transform row

    write row into csv_writer

close csv_reader and csv_write


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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