我有一个包含大约210万个日志(log)字符串的切片,我想创建一个字符串尽可能均匀分布的切片.

以下是我目前掌握的情况:

// 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中分块/拆分切片或在有限范围内迭代的文档或示例,所以这就是我想出来的.但是,它只复制第一个块多次,所以它不起作用.

我如何(尽可能均匀地)在围棋中切块?

推荐答案

您不需要制作新的切片,只需将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)

Go相关问答推荐

如何模拟嵌入. FS?

Go Net/http路由

错误.如果它包含切片,则返回FALSE

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

如何绕过深层 xml,没有嵌套循环?

如何将验证器标记添加到嵌套字段

通过多阶段构建复制到 Docker 容器中时找不到文件

为什么 net/http 不遵守超过 30 秒的超时持续时间?

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

GoLang: gocui 边框 colored颜色

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

无法将 graphql-ws 连接到 gqlgen

Gorm delete with clauses sqlmock 测试

Go 中的 HTTP 请求验证中间件

Golang:隐式 struct 匹配

在 GORM 中,如何在特定时区配置 autoCreateTime 和 autoUpdateTime?

如何在Go中替换符号并使下一个字母大写

Golang grpc go.mod 问题

如何排除溢出矩阵的坐标

不理解切片和指针