【问题标题】:ImageMagick throwing conversion error for large image on AWS LambdaImageMagick 在 AWS Lambda 上为大图像抛出转换错误
【发布时间】:2017-05-22 17:05:45
【问题描述】:

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

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

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

使用此设置,代码对于具有几 MB 的较小图像可以正常工作,但是当我尝试使用 ~40MB 的高分辨率图像时,它会失败并出现以下错误:

org.apache.commons.exec.ExecuteException:进程退出并出现错误:135

这个错误是什么意思?该程序是否会出现一些信号故障问题或什么?

此外,当我通过我的存根代码运行该程序进行测试时,它能够毫无问题地转换它。

【问题讨论】:

  • 也许在操作开始分页到磁盘之前检查将使用多少内存的设置,这是可以在 ImageMagick 中设置的策略之一。另外,请联系亚马逊支持。
  • 转换失败,因为 Imagick 需要约 4 GB 的内存或磁盘空间,而在 AWS Lambda 上,我们的资源有限,例如最大内存为 1536MB,磁盘空间为 500MB 等。这些限制可以通过询问 AWS Support 来增加,但我们仍然会以一种或另一种方式达到限制,因此请进一步阅读以提出更好的解决方案。

标签: java amazon-web-services lambda imagemagick


【解决方案1】:

你没有说你是如何进行收缩的,但如果你正在调整 JPEG 图像的大小,你必须使用 libjpeg 加载时收缩以获得良好的性能。

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

$ /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.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 等格式,差异会变得更大。我看到了 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的博文:

https://libvips.github.io/libvips/API/current/Using-vipsthumbnail.md.html

【讨论】:

  • sharp 不会在 lambda 中开箱即用,sharp 存储库中数十个线程的指令多种多样且令人费解。我尝试了至少六种建议的“修复”以使其正常工作,并且任何时候其中任何一个显示出任何程度的成功,我都会在其中遇到一些其他错误
猜你喜欢
  • 2011-09-29
  • 2018-07-15
  • 2019-11-25
  • 2017-07-12
  • 2021-10-25
  • 2017-01-05
  • 2019-05-15
  • 2012-03-31
相关资源
最近更新 更多