大型 CSV Go 通道内存过多

Large CSV Go channels too much memory

好的,所以我有一个巨大的 2.5G CSV 文件,大约有 2500 万条记录,大约有 20 列。我正在尝试使用 GO 来处理这个怪物并进行一些格式化,然后插入到数据库中。我有这个带有通道的基本代码设置,因为我认为使用 go routines 是最快的,例如: here

问题是因为它阻塞了,我的频道被大量的数据塞满了,在我意识到之前我的记忆力已经失控了。因此,在完成任何处理或插入之前,它会失败。

有人可以帮我解决这段代码,看看我是否可以在处理和插入文件的同时通过读取文件来建立队列?

对于大型 CSV 文件的每条记录,您都会启动一个新的协程。每个 goroutine 分配 ~2kB 个堆栈。不建议每件事都启动一个goroutine。

尝试使用管道,主 goroutine 将读取记录并通过 channel1.

发送

你开始,例如。 10 个 worker goroutine 处理从 channel1 接收到的记录并通过 channel2.

发送处理后的值

然后其他 10 个 goroutine 将从 channel2 接收值并将其插入数据库。

Here 是管道的一些示例。