2016-02-03 12 views
6

Ho una sezione con ~ 2,1 milioni di stringhe di registro, e vorrei creare una porzione di slice con le stringhe il più equamente distribuite possibile.Slice Chunking in Go

Ecco quello che ho finora:

// 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) 
} 

Il idx := i * ChunkSize mi darà l'attuale "inizio chunk" per l'indice logs, e end := i * ChunkSize + ChunkSize mi darà la "fine chunk", o la fine di la gamma di quel pezzo. Non sono riuscito a trovare alcuna documentazione o esempi su come dividere/dividere una porzione o iterare su un intervallo limitato in Go, quindi questo è ciò che mi è venuto in mente. Tuttavia, copia solo il primo blocco più volte, quindi non funziona.

In che modo (nel modo più uniforme possibile) ho tagliato una fetta in Go?

risposta

17

Non è necessario creare nuove sezioni, aggiungere sezioni di logs alla sezione 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 questo è quello che mi mancava. Ho continuato a provare a scorrere su un intervallo limitato invece di iterare attraverso la lunghezza del blocco. Ho passato 8 ore a cercare di capire come far funzionare la mia, lol. Grazie per la risposta, super utile. – mxplusb

+0

Sembra di essere spento di uno nella lunghezza di 'divisa'. Ad esempio, 'numCPU = 3; logs = logs [: 8]; chunkSize: = len (logs)/numCPU; if chunkSize == 0 {chunkSize = 1}; 'divide in 4, non in 3, per 3 cpus e 8 log: http://play.golang.org/p/EdhiclVR0q. Per 'chunkSize', scrivi' chunkSize: = (len (logs) + numCPU - 1)/numCPU; ': http://play.golang.org/p/xDyFXt45Fz. – peterSO

+0

@peterSO: grazie, l'ho appena copiato dall'originale e non ho pensato di controllare. – JimB