使用`make`进行并发内存分配?

时间:2014-09-16 15:26:40

标签: memory-management go goroutine

我将阅读一个大型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例程之前分配内存,并将数组的指针传递给每个例程,再加上读取行和设置值时需要开始的元素的索引。

1 个答案:

答案 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])
}