ImageMagick 转换和低 RAM

ImageMagick 转换和低 RAM

请考虑使用以下命令来使用 imagemagick 包:

sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

现在test1.jpg是一个相当大图像(12.5MB),但并非闻所未闻的大小,但我使用的服务器只有 1G 内存(亚马逊 EC2 t2.micro如果有帮助的话)

没有抛出任何错误,但也没有test2.jpg创建任何内容。我已经用较小的图像测试过,效果很好。我原本以为 1G 内存足以管理调整大小,但也许不够?

我有什么选择,我是否需要获得更多内存或者我缺少了什么?

欢迎任何建议!

要求编辑

strace 输出显示:+++ killed by SIGKILL +++以及很多看起来正常的命令(打开/usr/share/local和读取长字符串,我认为是图像数据)

免费提供给我:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

因此看起来好像没有启用交换,所以我将研究创建一个交换文件来看看这是否能解决我的问题。

文件给我:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

我也会粘贴完整的 /path/to/img,但不幸的是它包含敏感数据(客户电子邮件地址等)

答案1

我假设您的 RAM 不足。您可以watch cat /proc/meminfo在进程运行时验证这一点。

您的 RAM 和/或 SWAP 可能不足以完成您的任务。

由于内存不足,请确保交换已打开swapon -a,如果系统上没有设置交换,则在未使用的磁盘空间上创建一个交换分区并启用它。这可能会解决问题。@Takkat 有一个很好的答案,说明如何做到这一点这里如果你无权对服务器进行分区,你也可以使用交换文件用于交换

答案2

通过添加适当的交换空间,问题得到了解决。为了完整起见,让我总结一下convert在低内存系统上运行 Image Magick 处理大型文件时,或者在没有可用交换空间或交换空间太小时,我们可以使用的其他选项。

下面提到的方法在Image Magick手册中有详细阐述:

真正海量的图像处理


概括:

  1. 使用选项限制内存使用量-limit

    这样,一旦超出给定的内存限制,Image Magick 就会创建一个临时文件用于图像处理。这需要 Image Magick 对临时文件目录的写权限。我们可以在环境变量中指定创建临时文件的任何路径。MAGICK_TMPDIR示例命令可能类似于以下内容:

        env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    在磁盘而不是 RAM 上工作会大大降低处理速度。

  2. 使用“内存映射磁盘文件”

    创建 MPC 文件需要资源,但从 MPC 文件转换则不需要那么多资源。因此,如果我们需要多次转换具有不同参数的同一源,则可以考虑这一点。工作流程可能类似于此:

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. 使用stream

    使用溪流声称仅处理源图像的一部分,而无需将整个图像加载到内存中。

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    在上面的例子中,-extract选项采用 Image Magick 定义的大小和偏移值几何学。我们必须将图块重新粘在一起才能获得完整的缩放图像。不幸的是溪流不适用于所有图像格式,但应该可以很好地适用于 JPEG 图像。

相关内容