大型CSV Go会占用太多内存

时间:2018-06-02 04:44:23

标签: csv go blocking channel

好的,所以我有一个巨大的2.5G CSV文件,大约有25百万左右的记录,大约有20列。我正在尝试使用GO处理这个怪物并做一些格式化然后插入数据库。我有这个基本的代码设置与通道,因为我认为它将是最快的使用go例程,如下: here

问题在于它是阻塞的,我的频道刚刚收到大量数据的STUFFED,在我知道之前我的内存失控了。因此,在进行任何处理或插入之前,它都会失败。

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

1 个答案:

答案 0 :(得分:4)

对于您的大型CSV文件的每个记录,您都会启动一个新的goroutine。每个goroutine都分配~2kB堆栈。不建议为所有事情开始使用goroutine。

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

你开始,例如。处理从channel1收到的记录的10名工作人员goroutine,并通过channel2发送处理后的值。

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

Here是管道的一些示例。