gpt4 book ai didi

memory-management - 使用 `make` 的并发内存分配?

转载 作者:IT王子 更新时间:2023-10-29 01:39:50 24 4
gpt4 key购买 nike

我要读取一个大的 csv 文件并返回一个结构数组。因此,我决定将大文件拆分为多个较小的文件,每个文件有 100 万行,并使用 go routines 并行处理它们。

在每个工作人员中,我创建了一个数组来插入文件行:

for i := 0; i < 10 ; i++ {
go func(index int) {
lines := make([]MyStruct, 1000000)
}(i)
}

似乎 go 例程在这条线上互相等待。因此,如果为数组分配内存需要 1 秒,那么执行该操作的 10 个并发例程将需要 10 秒,而不是 1 秒!

你能帮我理解为什么吗?如果是这样,我想我会在启动 go 例程之前分配内存,并将数组的指针传递给它们中的每一个,加上它们在读取行和设置值时需要开始的元素的索引。

最佳答案

您需要设置 runtime.GOMAXPROCS(runtime.NumCPU())GOMAXPROCS 环境变量才能真正使用多核。

引用:http://golang.org/pkg/runtime/#GOMAXPROCS

引用@siritinga:

And of course, you need to do something with lines.

Right now, they are allocated and then lost for the garbage collector.

另一种方法是预分配 slice ,然后将其部分传递给 goroutine,例如:

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

关于memory-management - 使用 `make` 的并发内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com