2 回答

TA贡献1829条经验 获得超9个赞
要回答您的问题:
在这种情况下,如何释放“encodedString”的内存而不堆积?
你不能也不需要。未使用的内存被“释放”。
或者这可能不是我的错误编码,而 mem-leak 位于 lib base64 ?
不,包 encoding/base64 没有内存泄漏。(您在垃圾收集语言的标准库中的一个普通函数中检测到内存泄漏的可能性为 0。)
指导您找到解决方案:
您的应用程序使用了荒谬的内存量,但这是因为 a) 处理视频和图像会占用大量内存,并且 b) 您似乎没有采取任何措施来保持低内存:例如,您将整个图像编码为 bytes.Buffer,然后对整个字节进行编码。缓冲到一个字符串,然后处理该字符串,依此类推。您可能应该将图像编码为stream,将此流编码为 base64 并将此输出进一步流式传输到它存放的位置。这在 Go 中完全没有痛苦,因为所有这些编码器都在 io.Writers 上工作,可以很容易地链接起来。

TA贡献1813条经验 获得超2个赞
我上面的问题是完全错误的方式。
Base64 根本不是问题,它只是 pprof 显示的最大内存消耗者,导致我得出一个错误的结论,即 base64 是问题所在。
我猜 pprof 会告诉我我的 go 程序的所有内存消耗,包括 gocv。gocv 是 opencv 的 ac 包装器,但是 pprof 看不到它的内存消耗,因为它是 c 代码!(我在问这个问题时不知道)。由于 pprof 可见的内存消耗没有显示 c-wrapper 库使用的内存,例如 gocv。golang 根本看不到大部分内存消耗。所以 JimB 的帮助提示是:
看到您如何在 opencv 周围使用 Go 包装器,您关心的内存可能甚至没有被 Go 分配。在这种情况下,您确实需要确保所有内容都可能根据他们的文档关闭或发布,因为大部分工作是在 C++ 中完成的,而不是 Go。但是,即使您正在正确清理,您仍然需要了解您的内存限制,并确保您在任何给定点都不会尝试保存太多数据。
当我清理 gocv 对象时,内存消耗显着下降。我曾经关闭对象:
defer obj.close()
- 2 回答
- 0 关注
- 182 浏览
添加回答
举报