У меня есть фрагмент с ~ 2,1 миллиона строк журнала в нем, и я хотел бы создать кусочек срезов, причем строки будут как можно более равномерно распределены.Кусочек фрагмента в Go
Вот то, что я до сих пор:
// 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?
Ahhhhhhh это то, что мне не хватало. Я продолжал пытаться итерации в ограниченном диапазоне, а не итерации через длину блока. Я потратил 8 часов, пытаясь понять, как получить работу на шахте, lol. Спасибо за ответ, очень полезно. – mxplusb
Вы считаете, что вы отключены на единицу длины 'split'. Например, 'numCPU = 3; logs = logs [: 8]; chunkSize: = len (logs)/numCPU; если chunkSize == 0 {chunkSize = 1}; 'делит на 4, а не 3, для 3 cpus и 8 журналов: http://play.golang.org/p/EdhiclVR0q. Для 'chunkSize', напишите' chunkSize: = (len (logs) + numCPU - 1)/numCPU; ': http://play.golang.org/p/xDyFXt45Fz. – peterSO
@peterSO: спасибо, просто скопировал это из оригинала и не думал проверять. – JimB