gpt4 book ai didi

opencv - 垃圾收集不适用于 []gocv.Mat

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

代码中假设img是一个3 channel 的Mat。代码存在内存泄漏。我猜 slice “matsplits”中的指针(引用)不会被垃圾收集删除。我该如何解决?

for{
matsplits := gocv.Split(img)
matsplits[0].Close()
matsplits[1].Close()
matsplits[2].Close()
}

上述代码导致内存泄漏。我确定 imgarr 中的 Mat 对象已关闭,但内存使用量仍在增长。为什么?

更新:我项目中的部分代码

processed := 0
for processed < proc.imgNumber {
grayhconcatImg := <-proc.processedImg[0][chindex]
var roiList roilist
var numStartPosList numStartPos
for x := 0; x < 11520-w; x++ {
test := gocv.NewMat()
testRegion := grayhconcatImg.img.Region(image.Rect(x, 0, x+w, h))
gocv.BitwiseXor(chimg, testRegion, &test)
testRegion.Close()
//testsplit := gocv.Split(test)
test.Close()
//testsplit[0].Close()
//testsplit[1].Close()

processed++
}

如果未标记“testsplit”,则会发生内存泄漏。len(testsplit) 为 2。我检查过 testsplit[0] 和 testsplit[1] 在 testsplit[i].Close() 之后是否正确关闭。

最佳答案

Close()后,gc来了会清空一部分内存。像这样检查

    matsplits := gocv.Split(img)
matsplits[0].Close()
matsplits[1].Close()
matsplits[2].Close()
runtime.GC()

执行 GODEBUG=gctrace=1 go run main.go 2>xx.log您可以在 xx.log 中找到 gc 实际执行的操作

关于opencv - 垃圾收集不适用于 []gocv.Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54456414/

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