我在一个循环中读取100个jpeg图像并从中提取不同的区域。
循环内容:
VImage in = VImage::new_from_file(impath.c_str(),
VImage::option()->
set( "access", VIPS_ACCESS_SEQUENTIAL ) );
VImage out = in.extract_area(x0, y0, x1 - x0, y1 - y0);
cout << out.avg() << endl;
或者python中的相同内容:
img_full = pyvips.Image.new_from_file(impath, access='sequential')
img = img_full.extract_area(x0, y0, x1 - x0, y1 - y0)
print(img.avg())
我看RSS,物理内存使用情况。它从大约40MB开始,然后随着每个图像的增长而增长。
为什么会这样?某处是否有泄漏?
当我设置一个标记来跟踪泄漏pyvips.base.leak_set(1)
时,我报告了大约60 MB。我还使用cgroups将进程的物理内存限制为100 MB。 Vips能够在不崩溃的情况下运行,但速度较慢。
为了进行比较,OpenCV中的类似操作几乎消耗了一定量的RSS,140 MB或300 MB,具体取决于图像大小。对于我的实验,vips在CPU时间内赢了几次,但在内存中丢失了好几次。
pyvips版本:2.0.4
libvips版本:8.6.1
答案 0 :(得分:2)
我尝试了这个测试程序:
import sys
import pyvips
import random
for filename in sys.argv[1:]:
image = pyvips.Image.new_from_file(filename, access='sequential')
x = random.randint(0, image.width - 2)
y = random.randint(0, image.height - 2)
w = random.randint(1, image.width - x)
h = random.randint(1, image.height - y)
print 'filename =', filename, 'avg =', image.crop(x, y, w, h).avg()
我是这样跑的:
$ mkdir samples
$ for i in {1..2000}; do cp ~/pics/k2.jpg samples/$i.jpg; done
$ python soak.py samples/*
k2.jpg
是2k x 1.5k RGB jpg图像。在它跑的时候,我在top
看了RES。它在开始时略有上升,但在100左右的图像稳定在75MB左右并在那里停留了剩余的1900次迭代。这是py27,pyvips 2.0.4,libvips 8.6.1。
libvips保留cache of recent operations。通常这是无害的(并且有帮助),但在某些情况下它可能会触发不必要的内存使用。
您可以尝试添加:
pyvips.cache_set_max(0)
在程序开始附近。对于这个例子,它将峰值存储器从75mb降低到38mb。