web-dev-qa-db-ja.com

Goでのチャンクのスライス

約210万のログ文字列を含むスライスがあり、文字列ができるだけ均等に分散されたスライスのスライスを作成したいと考えています。

ここに私がこれまでに持っているものがあります:

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

idx := i * ChunkSizeは、logsインデックスの現在の「チャンクスタート」を提供し、end := i * ChunkSize + ChunkSizeは、「チャンクの終わり」、またはそのチャンクの範囲の終わりを示します。 Goでスライスをチャンク/スプリットする方法、または限られた範囲を反復処理する方法に関するドキュメントや例が見つからなかったので、これを思いつきました。ただし、最初のチャンクを複数回コピーするだけなので、機能しません。

Goでスライスを(できるだけ均等に)チャンクするにはどうすればよいですか?

16
mxplusb

新しいスライスを作成する必要はありません。logsスライスに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