gpt4 book ai didi

go - Go中的 slice 分块

转载 作者:IT老高 更新时间:2023-10-28 13:06:42 26 4
gpt4 key购买 nike

我有一个 slice ,其中包含约 210 万个日志字符串,我想创建一个 slice ,字符串尽可能均匀分布。

这是我目前所拥有的:

// 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 索引的当前“ block 开始”,以及 end := i * ChunkSize + ChunkSize 会给我“ block 结束”,或者那个 block 的范围的结束。我找不到任何关于如何在 Go 中分 block /分割 slice 或迭代有限范围的文档或示例,所以这就是我想出的。但是,它只会多次复制第一个 block ,所以它不起作用。

我如何(尽可能均匀地)在 Go 中分 block ?

最佳答案

您不需要制作新 slice ,只需将 logs slice 附加到 divided slice 即可。

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)

关于go - Go中的 slice 分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35179656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com