Image processing libvips rotate没有在设备上留下任何空间

Image processing libvips rotate没有在设备上留下任何空间,image-processing,vips,Image Processing,Vips,我正在使用libvips旋转图像。我使用的虚拟机有3002MB内存和512MB临时存储。AWS Lambda机器 我运行的旋转图像的命令是 vips rot original.jpg rotated.jpg d90 它会引发以下错误 Exit Code: 1, Error Output: ERROR: wbuffer_write: write failed unix error: No space left on device jpg图像约为10Mb。以下是libvips如何旋转jpg图像

我正在使用libvips旋转图像。我使用的虚拟机有3002MB内存和512MB临时存储。AWS Lambda机器

我运行的旋转图像的命令是

vips rot original.jpg rotated.jpg d90
它会引发以下错误

Exit Code: 1, Error Output: ERROR: wbuffer_write: write failed unix error: No space left on device

jpg图像约为10Mb。

以下是libvips如何旋转jpg图像

90度旋转要求对图像像素进行随机访问,但JPEG图像只能从上到下严格读取,因此作为第一步,libvips必须将JPG解压为随机访问格式。它使用vips(.v)格式,这几乎是一个带有小标题的C数组

对于解压缩的100mb以下的图像(您可以更改此值,请参见下文),它将解压缩到内存缓冲区。对于解压超过100mb的图像,它将解压到
/tmp
中的临时文件中(您可以更改此设置,请参见下文)

接下来,它对输出图像进行旋转。它可以作为一个单一的流操作来实现这一点,因此它通常需要足够的内存来存储输入图像上的256条扫描线和输出图像上的256条扫描线,因此在这种情况下大约需要30mb的内存,再加上每个线程更多的工作区域

在您的特定情况下,输入图像将被解压缩为30000 x 10000 x 3字节(约900mb)的临时文件。这远远超过了
/tmp
中的512mb,因此操作失败

最简单的解决方案是通过内存缓冲区强制加载程序。如果我尝试:

$ vipsheader x.jpg 
x.jpg: 30000x10000 uchar, 3 bands, srgb, jpegload
$ time vips rot x.jpg y.jpg d90 --vips-progress --vips-leak
vips temp-3: 10000 x 30000 pixels, 8 threads, 128 x 128 tiles, 256 lines in buffer
vips x.jpg: 30000 x 10000 pixels, 8 threads, 30000 x 16 tiles, 256 lines in buffer
vips x.jpg: done in 0.972s          
vips temp-3: done in 4.52s          
memory: high-water mark 150.43 MB
real    0m4.647s
user    0m5.078s
sys 0m8.418s
leak
progress
标志使VIP报告一些统计数据。您可以看到,对临时文件的初始解压缩是0.97s,对输出的旋转是4.5s,它需要150mb的像素缓冲区和900mb的光盘

如果我提高阈值,我会看到:

$ time VIPS_DISC_THRESHOLD=1gb vips rot x.jpg y.jpg d90 --vips-progress --vips-leak
vips temp-3: 10000 x 30000 pixels, 8 threads, 128 x 128 tiles, 256 lines in buffer
vips x.jpg: 30000 x 10000 pixels, 8 threads, 30000 x 16 tiles, 256 lines in buffer
vips x.jpg: done in 0.87s          
vips temp-3: done in 1.98s          
memory: high-water mark 964.79 MB
real    0m2.039s
user    0m3.842s
sys 0m0.443s
现在第二个旋转阶段只有2秒,因为它只是读取内存,但内存使用量已经上升到1gb左右

该系统在libvips文档中介绍如下:


图像大小(以像素为单位)是多少?宽度:
28348
,高度是
10104
,需要820MB内存,乘以2。您能告诉我旋转需要多少磁盘空间吗?因为我使用临时文件来存储旋转和原始图像。可用的临时空间是512MBAs可用的RAM是
3002MB
我想你错过了粘贴链接我无意中按下了提交,愚蠢的笔记本触摸板:(现在更新了。@user894763,哈,这是我第二次看到你的触摸板出现故障。你不能以毫秒为单位调整点击检测间隔吗?呵呵,是的,我应该设法调整一下。