【问题标题】:Images use too much RAM in Processing图像在处理中使用过多的 RAM
【发布时间】:2019-09-28 21:21:11
【问题描述】:

我正在尝试加载几千张小图像进行处理并将它们显示为更大的地图。图像的总文件大小为 130MiB,但是当我运行该程序时,它使用了我所有的 RAM,并且由于 RAM 使用量超过 2GiB,我什至得到了OutOfMemoryError

与文件大小相比,导致内存使用量超过 10 倍的原因是什么,我有什么办法可以缓解这种情况?

编辑:

示例代码

ArrayList<PImage> images = new ArrayList<PImage>();
void setup() {
    for (int i = 0; i < 2000 /*num of images*/; i++) {
        images.add(loadImage(Integer.toString(i) + ".jpg");
    }
}

//in reality, never gets here
void draw() {

    for (PImage i: images) {
        image(i, /*precalculated x and y*/ random(500), random(500));
    }
}

【问题讨论】:

  • 你能发个minimal reproducible example吗?
  • @KevinWorkman 好的,现在添加一个
  • 这可能是黑魔法,没有密码谁知道。
  • JPEG 压缩比是 10:1,这样就可以解释:图像在磁盘上被压缩,但是当加载到您的程序并解压缩时,您会得到 10 倍的大小。
  • @jbx 添加了一个例子

标签: java image memory processing


【解决方案1】:

JPEG 压缩比是 10:1,这可以解释:图像在磁盘上被压缩,但是当加载到您的程序并解压缩时,您会得到 10 倍的大小。

为了改进您的代码,不要一次加载所有图像:一次处理几个。

【讨论】:

  • 不幸的是,我无法一次处理几个,因为我需要一次绘制它们(它们是地图片段,我需要绘制整个地图)。但这确实解释了原因。我会在几秒钟内接受
  • 不要在内存中保留超过屏幕大小(几百 MB)。在片段进出视图时加载和丢弃片段。
  • 这就是我正在尝试做的事情,它在放大时工作正常,但是当你缩小时就会出现问题(有时需要一次查看整个地图)。我想我要做的是调整图像的大小,如果不放大以希望减少内存使用。
猜你喜欢
  • 2021-12-07
  • 2017-10-31
  • 2012-08-31
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多