2016-02-03 95 views
6

我有一個切片,裏面有大約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中切片?

回答

17

您不需要創建新切片,只需將切片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) 
+0

Ahhhhhhh這就是我失蹤了。我一直試圖遍歷一個有限的範圍,而不是通過塊長度迭代。我花了8個小時試圖弄清楚如何讓我的工作,哈哈。感謝您的回答,超級有用。 – mxplusb

+0

你看起來被分開的長度中的一個偏離了。例如,'numCPU = 3;日誌=日誌[:8]; chunkSize:= len(日誌)/ numCPU;如果chunkSize == 0 {chunkSize = 1};對於3個cpus和8個日誌,分爲4個而不是3個:http://play.golang.org/p/EdhiclVR0q。對於'chunkSize',寫'chunkSize:=(len(logs)+ numCPU-1)/ numCPU;':http://play.golang.org/p/xDyFXt45Fz。 – peterSO

+0

@peterSO:謝謝,剛從原版複製而來,並沒有想到要檢查。 – JimB