为了账号安全,请及时绑定邮箱和手机立即绑定

重复调用image.png.Decode()会导致内存不足错误

重复调用image.png.Decode()会导致内存不足错误

Go
月关宝盒 2021-04-29 17:00:03
我正在尝试做我原来认为很简单的事情。以机智:对于输入文件列表中的每个文件:用png.Decode()打开文件扫描文件中的每个像素并测试其是否为“灰色”。返回图像中“灰色”像素的百分比。这是我正在调用的函数:func greyLevel(fname string) (float64, string) {    f, err := os.Open(fname)    if err != nil {            return -1.0, "can't open file"    }    defer f.Close()    i, err := png.Decode(f)    if err != nil {            return -1.0, "unable to decode"    }    bounds := i.Bounds()    var lo uint32 = 122 // Low grey RGB value.    var hi uint32 = 134 // High grey RGB value.    var gpix float64    // Grey pixel count.    var opix float64    // Other (non-grey) pixel count.    var tpix float64    // Total pixels.    for x := bounds.Min.X; x < bounds.Max.X; x++ {            for y := bounds.Min.Y; y < bounds.Max.Y; y++ {                    r, g, b, _ := i.At(x, y).RGBA()                    if ((r/255)-1 > lo && (r/255)-1 < hi) &&                            ((g/255)-1 > lo && (g/255)-1 < hi) &&                            ((b/255)-1 > lo && (b/255)-1 < hi) {                            gpix++                    } else {                            opix++                    }                    tpix++            }    }    return (gpix / tpix) * 100, ""} func main() {    srcDir := flag.String("s", "", "Directory containing image files.")    threshold := flag.Float64("t", 65.0, "Threshold (in percent) of grey pixels.")    flag.Parse()    dirlist, direrr := ioutil.ReadDir(*srcDir)    if direrr != nil {            log.Fatalf("Error reading %s: %s\n", *srcDir, direrr)    }    for f := range dirlist {            src := path.Join(*srcDir, dirlist[f].Name())            level, msg := greyLevel(src)            if msg != "" {                    log.Printf("error processing %s: %s\n", src, msg)                    continue            }            if level >= *threshold {                    log.Printf("%s is grey (%2.2f%%)\n", src, level)            } else {                    log.Printf("%s is not grey (%2.2f%%)\n", src, level)            }    }}
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

看来您使用的是32位计算机。因为Go的垃圾回收器很保守,所以程序可能内存不足。保守的垃圾收集器可能无法检测到不再使用某些内存区域。目前在比避免数据结构,垃圾收集器无法处理其他围棋程序没有解决此(如:struct {...; binaryData [256]byte}

尝试runtime.GC()在要调用function的循环的每个迭代中调用greyLevel。也许它将帮助程序处理更多图像。

如果调用runtime.GC()无法改善情况,则可能需要更改策略,以便该程序每次运行处理较少数量的PNG文件。


查看完整回答
反对 回复 2021-05-10
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

好像是3173问题,该问题最近已得到修复。您能重试一下最近一次的每周吗?(假设您现在使用的是2012-03-07之前的版本)。


查看完整回答
反对 回复 2021-05-10
  • 2 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号