ImageMagick在AWS Lambda上抛出大图像的转换错误

时间:2017-05-22 17:05:46

标签: java amazon-web-services lambda imagemagick

我们有一个用Java编写的程序,我正在AWS Lambda上部署。

该程序通过预先安装在Lambda上的Imagick将给定图像转换为不同的缩略图。我们已将Lambda设置为使用最大1536 MB内存,而在应用程序中将convert命令限制为:

imConvertPath = imPath + "convert  -limit memory 1GB -limit map 1350MB";

使用此设置,代码适用于具有几MB的较小图像但是当我尝试使用~40MB的高分辨率图像时,它会因此错误而失败:

  

org.apache.commons.exec.ExecuteException:进程退出时出错:135

这个错误是什么意思?该程序是否会进入某些sig故障问题或什么?

此外,当我通过我的存根代码运行此程序进行测试时,它可以将其转换为任何问题。

1 个答案:

答案 0 :(得分:1)

您没有说明如何缩小,但如果要调整JPEG图像的大小,则必须使用libjpeg shrink-on-load以获得良好的性能。

例如,在这台具有10,000 x 10,000像素RGB jpeg图像和IM 7.0.5-5的机器(2012 imac)上,我看到:

$ /usr/bin/time -l convert wtc.jpg -resize 500x500 x.jpg
        6.87 real         6.06 user         0.51 sys
1269547008  maximum resident set size

所以大约有7s和1.2GB的内存。如果我使用收缩负载,你向jpeg加载器提示你需要的像素尺寸,我看到:

$ /usr/bin/time -l convert -define jpeg:size=1000x1000 wtc.jpg -resize 500x500 x.jpg
        0.32 real         0.27 user         0.02 sys
  34181120  maximum resident set size

低至0.3秒和34MB内存。

这仅适用于JPEG文件,但它确实有很大帮助。您需要提示最终输出的两倍大小,否则您将看到别名。

要提高其他文件类型的性能,您需要查看其他图像大小调整程序。我帮助维护流媒体图像处理库libvips。它可以作为连续的像素流进行解码,处理和重新编码,因此不需要将整个图像保存在内存中。

使用30,000 x 30,000 JPEG和转换,我看到:

$ /usr/bin/time -l convert -define jpeg:size=1000x1000 big.jpg -resize 500x500 x.jpg
        3.08 real         2.92 user         0.14 sys
 300138496  maximum resident set size

3.1秒和300MB内存,但 vipsthumbnail 我看到了:

$ /usr/bin/time -l vipsthumbnail big.jpg --size 500x500 -o x.jpg
        2.38 real         2.31 user         0.06 sys
  28385280  maximum resident set size

2.4s和28MB的内存。

对于没有负载收缩系统的TIFF等格式,差异变得更大。使用10,000 x 10,000 RGB TIFF,我看到:

$ /usr/bin/time -l convert wtc.tif -resize 500x500 x.jpg
        5.81 real         4.97 user         0.60 sys
1503449088  maximum resident set size

5.8s和1.5GB的内存,而不是:

$ /usr/bin/time -l vipsthumbnail wtc.tif --size 500x500 -o x.jpg
        1.43 real         0.47 user         0.08 sys
  42360832  maximum resident set size

1.4s和42MB的内存。

有一个非常好的node.js图像调整大小包,名为sharp基于libvips,它将在lambda上轻松部署,或者如果你想使用Java中的命令行vipsthumbnail程序,有各种构建器,用于例如:

https://github.com/stechstudio/libvips-lambda

这里有一篇介绍vipsthumbnail的博客文章:

http://libvips.blogspot.co.uk/2013/11/tips-and-tricks-for-vipsthumbnail.html