web-dev-qa-db-fra.com

Couper en tranches dans Go

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?

16
mxplusb

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)
50
JimB