Java AWS Lambda上大图像的ImageMagick转换错误
我们有一个用Java编写的程序,我正在AWS Lambda上部署它 该程序通过预先安装在Lambda上的Imagick将给定图像转换为不同的缩略图。我们已将Lambda设置为使用最大1536 MB内存,同时在应用程序中限制convert命令:Java AWS Lambda上大图像的ImageMagick转换错误,java,amazon-web-services,lambda,imagemagick,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的高分辨率图像时,它失败,出现
imConvertPath = imPath + "convert -limit memory 1GB -limit map 1350MB";
使用此设置,代码对于较小的图像(只有几MB)工作正常,但当我尝试使用~40MB的高分辨率图像时,它失败,出现以下错误:
org.apache.commons.exec.ExecuteException:进程退出,出现错误:135
这个错误意味着什么?程序是否出现了sig故障问题
另外,当我使用via存根代码运行此程序进行测试时,它能够在没有任何问题的情况下对其进行转换。您没有说明如何进行收缩,但如果要调整JPEG图像的大小,则必须在加载时使用libjpeg shrink以获得良好的性能 例如,在这台拥有10000 x 10000像素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.3s和34MB内存
这只适用于JPEG文件,但确实有很大帮助。您需要提示两倍于最终输出的大小,否则您将看到别名
要提高其他文件类型的性能,您需要查看其他图像大小调整程序。我帮助维护,一个流图像处理库。它可以解码、处理和重新编码为连续的像素流,因此不需要将整个图像保存在内存中
使用30000 x 30000 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.1s和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这样没有加载收缩系统的格式,差异会变得更大。使用10000 x 10000 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 image resize包,名为based on libvips,应该部署在lambda上,或者如果您想使用Java中的命令行vipsthumbnail程序,有多种构建器,例如:
这里有一篇介绍vipsthumbnail的博客文章:
在操作开始分页到磁盘之前,可以检查内存使用量的设置,这是可以在ImageMagick中设置的策略之一。另外,请联系亚马逊支持部门。由于Imagick需要约4 GB的内存或磁盘空间,而在AWS Lambda上,我们的资源有限,例如最大内存为1536MB,因此转换失败,磁盘空间500MB等。这些限制可以通过请求AWS支持来增加,但我们仍将以某种方式达到限制,因此请进一步阅读,以找到更好的解决方案。sharp不会在lambda中使用开箱即用,并且sharp存储库中数十个线程的说明多种多样,错综复杂。我尝试了至少六个建议的“修复”来让它工作,但每当其中任何一个显示出任何程度的成功时,我都会在它的位置上出现一些其他错误