【发布时间】:2014-09-16 15:26:40
【问题描述】:
我将读取一个大的 csv 文件并返回一个结构数组。因此,我决定将大文件拆分为多个小文件,每个文件有 100 万行,并使用 go 例程并行处理它们。
在每个工人内部,我创建了一个数组来插入文件行:
for i := 0; i < 10 ; i++ {
go func(index int) {
lines := make([]MyStruct, 1000000)
}(i)
}
似乎 go 例程在这条线上相互等待。因此,如果数组的内存分配需要 1 秒,那么执行此操作的 10 个并发例程将需要 10 秒,而不是 1 秒!
你能帮我理解为什么吗?如果是这样,我想我会在启动 go 例程之前分配内存并将数组的指针传递给它们中的每一个,加上它们在读取行和设置值时需要开始的元素的索引。
【问题讨论】:
-
你在设置 GOMAXPROCS 环境变量吗?如果没有,默认情况下 Go 将只使用一个 CPU 内核。
-
@siritinga 没有改进。我设置
GOMAXPROCS后,每次运行的性能都不一样。也许这表明工人正在研究不同的核心。但它仍然比分配一次内存要慢很多。 -
对于它的价值,只是在你去的时候附加到一个大的旧切片可能比你想象的要好:测试for another question,一百万个附加到
[]string需要77ms。
标签: memory-management go goroutine