Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWS Lambda上大图像的ImageMagick转换错误_Java_Amazon Web Services_Lambda_Imagemagick - Fatal编程技术网

Java AWS Lambda上大图像的ImageMagick转换错误

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的高分辨率图像时,它失败,出现

我们有一个用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故障问题


另外,当我使用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存储库中数十个线程的说明多种多样,错综复杂。我尝试了至少六个建议的“修复”来让它工作,但每当其中任何一个显示出任何程度的成功时,我都会在它的位置上出现一些其他错误