我循环读取 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 开始,然后随着每个图像的增长而增长。
这是具有相同作物原点、宽度/高度的 4 倍原始尺寸的图像的图表。
为什么会这样?是否有泄漏的地方?当我设置一个标志来跟踪泄漏时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