大型 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 是管道的一些示例。
好的,所以我有一个巨大的 2.5G CSV 文件,大约有 2500 万条记录,大约有 20 列。我正在尝试使用 GO 来处理这个怪物并进行一些格式化,然后插入到数据库中。我有这个带有通道的基本代码设置,因为我认为使用 go routines 是最快的,例如: here
问题是因为它阻塞了,我的频道被大量的数据塞满了,在我意识到之前我的记忆力已经失控了。因此,在完成任何处理或插入之前,它会失败。
有人可以帮我解决这段代码,看看我是否可以在处理和插入文件的同时通过读取文件来建立队列?
对于大型 CSV 文件的每条记录,您都会启动一个新的协程。每个 goroutine 分配 ~2kB
个堆栈。不建议每件事都启动一个goroutine。
尝试使用管道,主 goroutine 将读取记录并通过 channel1
.
你开始,例如。 10 个 worker goroutine 处理从 channel1
接收到的记录并通过 channel2
.
然后其他 10 个 goroutine 将从 channel2
接收值并将其插入数据库。
Here 是管道的一些示例。