我们有一个用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故障问题或什么?
此外,当我通过我的存根代码运行此程序进行测试时,它可以将其转换为任何问题。
答案 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