什么是使内存包含在切片中的有效方法?

时间:2019-05-15 11:32:03

标签: go grpc

我正在通过gRPC流发送相等的数据块。块实际上是数据库行,每个行的类型为[][]byte。可能有大数据集(2Gb或更多),所以我需要控制消息的大小(当前,我为每条消息设置2Mb)。例如。如果我得到的行大小为100Kb,则将其存储到临时缓冲区中并追加下一行,直到缓冲区大小等于(或几乎等于)2Mb,然后发送缓冲区,然后清除缓冲区并重新开始,直到发送完整的数据集为止。

这里的问题是因为我使用了计算行大小的函数。我使用此函数来获取当前的缓冲区大小和行大小(每行两次调用)。 事实证明,此功能非常慢。

func nestlen(row [][]byte) (counter int) {
    for _, r := range row {
        counter += len(r)
    }

    return
}

看一下CPU配置文件。仅花费~50%的时间即可计算行和缓冲区的内存! (profiler screenshot

有没有更有效的方法来获取包含在分片中的内存?也许还有其他方法可以解决这个问题?

0 个答案:

没有答案