【问题标题】:Large CSV Go channels too much memory大型 CSV Go 通道内存过多
【发布时间】:2018-11-12 04:41:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: csv go blocking channel


    【解决方案1】:

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

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

    你开始例如。 10 个工作 goroutine,处理从 channel1 接收的记录并将处理后的值发送到 channel2

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

    Here 是管道的一些示例。

    【讨论】:

      猜你喜欢
      • 2015-08-26
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      相关资源
      最近更新 更多