vips和pyvips物理内存使用情况

时间:2018-01-30 00:51:42

标签: vips

我在一个循环中读取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开始,然后随着每个图像的增长而增长。

这是一张图: enter image description here

以下是原始尺寸4X图像的图表,其原始尺寸与宽度/高度相同。 enter image description here

为什么会这样?某处是否有泄漏? 当我设置一个标记来跟踪泄漏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

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。