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 关注
- 239 浏览
添加回答
举报