Ich habe eine Scheibe mit ~ 2,1 Millionen Log-Strings drin, und ich möchte eine Scheibe von Scheiben mit den Saiten so gleichmäßig verteilt wie möglich zu schaffen. HierSlice-Chunking in Go
ist das, was ich bisher:
// 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)
}
Die idx := i * ChunkSize
geben Sie mir den aktuellen „chunk Start“ für den logs
Index und end := i * ChunkSize + ChunkSize
gibt mir die „chunk Ende“, oder das Ende die Reichweite dieses Stücks. Ich konnte keine Dokumentation oder Beispiele finden, wie man einen Slice chunk/split oder über einen begrenzten Bereich in Go iteriert, also habe ich das gefunden. Es kopiert jedoch nur den ersten Chunk mehrmals, so dass es nicht funktioniert.
Wie kann ich (möglichst gleichmäßig) ein Stück in Go aufteilen?
Ahhhhhhh das ist, was mir fehlte. Ich habe versucht, über einen begrenzten Bereich zu iterieren, anstatt über die Chunk-Länge zu iterieren. Ich habe 8 Stunden damit verbracht, herauszufinden, wie ich meins funktioniere, lol. Danke für die Antwort, super hilfreich. – mxplusb
Sie sehen aus, um eins in der Länge von "geteilt" zu sein. Zum Beispiel: numCPU = 3; Protokolle = Protokolle [: 8]; chunkSize: = len (logs)/numCPU; if chunkSize == 0 {chunkSize = 1}; 'unterteilt sich in 4, nicht 3, für 3 CPUs und 8 Protokolle: http://play.golang.org/p/EdhiclVR0q. Schreiben Sie für 'chunkSize'' chunkSize: = (len (logs) + numCPU - 1)/numCPU; ': http://play.golang.org/p/xDyFXt45Fz. – peterSO
@peterSO: danke, kopierte das einfach vom Original und dachte nicht nach zu überprüfen. – JimB