我有一个包含大约210万条日志字符串的切片,我希望创建一个尽可能均匀分布字符串的切片。
这是我目前的代码:
// logs is a slice with ~2.1 million strings in it.
var divided = make([][]string, 0)
NumCPU := runtime.NumCPU()
ChunkSize := len(logs) / NumCPU
for i := 0; i < NumCPU; i++ {
temp := make([]string, 0)
idx := i * ChunkSize
end := i * ChunkSize + ChunkSize
for x := range logs[idx:end] {
temp = append(temp, logs[x])
}
if i == NumCPU {
for x := range logs[idx:] {
temp = append(temp, logs[x])
}
}
divided = append(divided, temp)
}
idx := i * ChunkSize
将给我当前 logs
索引的"块起始位置",end := i * ChunkSize + ChunkSize
将给我"块结束"或该块范围的结束。我在 Go 中找不到任何文档或示例来拆分切片或遍历有限范围,所以这就是我想出来的方法。然而,它只多次复制第一个块,因此无法工作。
如何尽可能平均地在 Go 中将一个切片分块?
divided
的长度上看起来有一个偏差。例如,numCPU = 3; logs = logs[:8]; chunkSize := len(logs) / numCPU; if chunkSize == 0 { chunkSize = 1 };
对于3个CPU和8个日志进行划分时,应该是4而不是3:http://play.golang.org/p/EdhiclVR0q。对于`chunkSize`,请写成`chunkSize := (len(logs) + numCPU - 1) / numCPU;`:http://play.golang.org/p/xDyFXt45Fz。 - peterSO(len(logs) + numCPU - 1) / numCPU
是什么意思,那就是len(logs)/numCPU
的上限。 - Arpan Srivastava