【发布时间】:2020-12-17 01:43:41
【问题描述】:
我正在使用 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 设置为零来进行故障排除,但没有任何变化。
【问题讨论】:
-
嗯,主要原因是您没有按原样存储数据,而是尝试将其存储为
map。 -
你能告诉我更多吗?我是否缺少有关地图如何存储在内存中的重要知识?我会再读一遍,但如果您能给我您的见解,我将不胜感激
-
我读了一遍,似乎通过调用 runtime.GC() 修复了一些问题。现在它消耗了大约 8GB 的内存!谢谢