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?
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
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
@peterSO: grazie, l'ho appena copiato dall'originale e non ho pensato di controllare. – JimB