2016-02-03 3 views
6

У меня есть фрагмент с ~ 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?

ответ

17

Вам не нужно делать новые ломтики, просто добавьте ломтики от logs до divided ломтик.

http://play.golang.org/p/vyihJZlDVy

var divided [][]string 

chunkSize := (len(logs) + numCPU - 1)/numCPU 

for i := 0; i < len(logs); i += chunkSize { 
    end := i + chunkSize 

    if end > len(logs) { 
     end = len(logs) 
    } 

    divided = append(divided, logs[i:end]) 
} 

fmt.Printf("%#v\n", divided) 
+0

Ahhhhhhh это то, что мне не хватало. Я продолжал пытаться итерации в ограниченном диапазоне, а не итерации через длину блока. Я потратил 8 часов, пытаясь понять, как получить работу на шахте, lol. Спасибо за ответ, очень полезно. – mxplusb

+0

Вы считаете, что вы отключены на единицу длины '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

+0

@peterSO: спасибо, просто скопировал это из оригинала и не думал проверять. – JimB

Смежные вопросы