我正在通过gRPC流发送相等的数据块。块实际上是数据库行,每个行的类型为[][]byte
。可能有大数据集(2Gb或更多),所以我需要控制消息的大小(当前,我为每条消息设置2Mb)。例如。如果我得到的行大小为100Kb,则将其存储到临时缓冲区中并追加下一行,直到缓冲区大小等于(或几乎等于)2Mb,然后发送缓冲区,然后清除缓冲区并重新开始,直到发送完整的数据集为止。
这里的问题是因为我使用了计算行大小的函数。我使用此函数来获取当前的缓冲区大小和行大小(每行两次调用)。 事实证明,此功能非常慢。
func nestlen(row [][]byte) (counter int) {
for _, r := range row {
counter += len(r)
}
return
}
看一下CPU配置文件。仅花费~50%
的时间即可计算行和缓冲区的内存! (profiler screenshot)
有没有更有效的方法来获取包含在分片中的内存?也许还有其他方法可以解决这个问题?