我将阅读一个大型csv文件并返回一个结构数组。因此,我决定将大文件拆分为多个较小的文件,每个文件有100万行,并使用go例程并行处理它们。
在每个worker中,我创建一个数组来插入文件行:
for i := 0; i < 10 ; i++ {
go func(index int) {
lines := make([]MyStruct, 1000000)
}(i)
}
似乎go例程在这一行上等待。因此,如果数组的内存分配需要1秒,那么10个并发例程将需要10秒,而不是1秒!
你可以帮我理解为什么吗?如果是这样的话,我想我会在开始go例程之前分配内存,并将数组的指针传递给每个例程,再加上读取行和设置值时需要开始的元素的索引。答案 0 :(得分:3)
您需要为其设置runtime.GOMAXPROCS(runtime.NumCPU())
或GOMAXPROCS
环境变量才能实际使用多个核心。
参考:http://golang.org/pkg/runtime/#GOMAXPROCS
引用@siritinga:
当然,你需要用线做一些事情。
现在,他们被分配然后丢失给垃圾收集器。
另一种方法是预先分配切片,然后将其部分传递给goroutines,例如:
N := 1000000
lines := make([]MyStruct, N * 10)
for i := 0; i < 10 ; i++ {
idx := i * N
go func(lines []MyStruct) {
//do stuff with lines
}(lines[idx:idx+N])
}