【问题标题】:libvips rotate is throwing no space left on devicelibvips 旋转在设备上没有剩余空间
【发布时间】:2018-04-30 10:03:54
【问题描述】:

我正在使用 libvips 来旋转图像。我正在使用具有 3002 MB Ram 和 512MB 临时存储的 VM。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。

【问题讨论】:

  • 图片大小,以像素为单位?
  • 宽度:28348,高度为10104
  • 这需要 820 MB 的 RAM,乘以 2。
  • 你能告诉我旋转需要多少磁盘空间吗?因为我使用临时文件来存储旋转和原始图像。可用临时空间为 512MB
  • 可用内存为3002 MB

标签: image-processing vips


【解决方案1】:

这是 libvips 将如何旋转您的 jpg 图像的方法。

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

对于100mb以下的图片(你可以改变这个值,见下文)解压后,它会解压到内存缓冲区。对于解压后超过 100mb 的图像,它会解压到 /tmp 中的一个临时文件(您可以更改此设置,见下文)。

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

在您的特定情况下,输入图像被解压缩为 30,000 x 10,000 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

leakprogress 标志使 vips 报告一些统计数据。可以看到初始解压到临时文件是 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

现在第二个循环阶段只有 2s,因为它只是读取内存,但内存使用量已经上升到 1gb 左右。

此系统在此处的 libvips 文档中介绍:

http://jcupitt.github.io/libvips/API/current/How-it-opens-files.md.html

【讨论】:

  • 我想你错过了粘贴链接
  • 我不小心按了提交,愚蠢的笔记本电脑触摸板:(现在更新了。
  • 呵呵是的,我应该考虑调整一下。
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2012-01-14
  • 2012-05-15
  • 2018-11-22
  • 2015-07-21
  • 2020-12-16
  • 2014-11-20
  • 2018-12-27
相关资源
最近更新 更多