J'ai une tranche contenant environ 2,1 millions de chaînes de journaux, et je voudrais créer une tranche de tranches avec les chaînes réparties aussi uniformément que possible.
Voici ce que j'ai jusqu'à présent:
// 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)
}
Le idx := i * ChunkSize
me donnera le "début de bloc" actuel pour l'index logs
et end := i * ChunkSize + ChunkSize
me donnera la "fin de bloc", ou la fin de la plage de ce morceau. Je n'ai pas pu trouver de documentation ou d'exemples sur la façon de fragmenter/fractionner une tranche ou d'itérer sur une plage limitée dans Go, c'est donc ce que j'ai trouvé. Cependant, il ne copie que le premier morceau plusieurs fois, donc cela ne fonctionne pas.
Comment puis-je (aussi uniformément que possible) découper une tranche dans Go?
Vous n'avez pas besoin de créer de nouvelles tranches, ajoutez simplement des tranches de logs
à la tranche 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)