2 回答

TA貢獻1887條經驗 獲得超5個贊
這沒有什么令人驚訝的。在您的磁盤上只有 CSV 文本的字符(字節)。當您將它們加載到內存中時,您會從文本中創建數據結構。
例如,一個float64
值在內存中需要 64 位,即:8 個字節。如果您有輸入 text "1"
,則為 1 個單字節。然而,如果你創建一個float64
等于 的值1
,那仍然會消耗 8 個字節。
此外,string
s 存儲有一個字符串頭 ( reflect.StringHeader
),它是 2 個整數值(在 64 位架構上為 16 個字節),并且該頭指向實際的字符串數據。有關詳細信息,請參閱Golang中的字符串內存使用情況。
切片也是類似的數據結構:reflect.SliceHeader
. 標頭由 3 個整數值組成,即使切片中沒有元素,在 64 位架構上也是 24 個字節。
在此之上的結構可能具有填充(字段必須與某些值對齊),這再次增加了開銷。有關詳細信息,請參閱規格:尺寸和對齊保證。
Go Maps 是 hashmaps,它也有相當多的開銷,有關詳細信息,請參閱為什么切片值有時會過時但從不映射值?,對于內存使用情況,請參閱Golang maps 保留多少內存?

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
- 2 回答
- 0 關注
- 229 瀏覽
添加回答
舉報