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

我正在尝试做我原来认为很简单的事情。以机智:

对于输入文件列表中的每个文件:

  1. 用png.Decode()打开文件

  2. 扫描文件中的每个像素并测试其是否为“灰色”。

  3. 返回图像中“灰色”像素的百分比。

这是我正在调用的函数:

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)

            }

    }

}


月关宝盒
浏览 339回答 2
2回答

慕雪6442864

看来您使用的是32位计算机。因为Go的垃圾回收器很保守,所以程序可能内存不足。保守的垃圾收集器可能无法检测到不再使用某些内存区域。目前在比避免数据结构,垃圾收集器无法处理其他围棋程序没有解决此(如:struct {...; binaryData [256]byte})尝试runtime.GC()在要调用function的循环的每个迭代中调用greyLevel。也许它将帮助程序处理更多图像。如果调用runtime.GC()无法改善情况,则可能需要更改策略,以便该程序每次运行处理较少数量的PNG文件。

牧羊人nacy

好像是3173问题,该问题最近已得到修复。您能重试一下最近一次的每周吗?(假设您现在使用的是2012-03-07之前的版本)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go