gpt4 book ai didi

go - http.Response.Body 复制导致大量内存使用增加

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:42 27 4
gpt4 key购买 nike

所以我试图从 http.Response 中获取响应主体,进行一些操作,然后将其设置回去。这是我第一次尝试在不耗尽 http.Response 的情况下将其取出:

bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
// err
} else {
cachedBody := string(bodyBytes)

// Restore the io.ReadCloser to its original state
// This is causing huge increases in memory usage.
resp.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
}

如果我发送 500 个请求,响应大小为 1mb(一大段 JSON,但它可以是任何格式,而不仅仅是 JSON),服务器内存使用量上升到 ~400mb,并且不会返回吃下。这是正常的吗?上面的代码有问题吗?我是否缺少释放内存的东西?

defer resp.Body.Close() 没有效果。

谢谢!


编辑 1

这是代理的简单版本的要点,包括建议的千钧一发。如果位于 localhost:3000 的服务器(它所代理的位置)返回大量响应,内存使用量将迅速增加。在我的例子中,我返回了一个 1mb 的 json 文件,并且通过 go 代理发送 500 个请求将内存使用量增加到大约 400mb。

go 代理:
https://gist.github.com/marbemac/300c4c376171cbd27cc3

一个简单的节点服务器,返回同一目录中名为 large_response.json 的文件。
https://gist.github.com/marbemac/55aaa78f5858484d33f6

最佳答案

body 必须在使用后关闭。引用this

请注意,在您为 resp.Body 重新分配新值后调用 defer resp.Body.Close()

关于go - http.Response.Body 复制导致大量内存使用增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450094/

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