2016-02-03 17 views
6

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?

Antwort

17

Sie müssen keine neuen Schichten erstellen, sondern nur Schichten von logs an die divided Schicht anfügen.

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 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

+0

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

+0

@peterSO: danke, kopierte das einfach vom Original und dachte nicht nach zu überprüfen. – JimB