ImageMagick转换和低内存


12

请为imagemagick软件包考虑以下命令:

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

现在test1.jpg是一个相当大的图像(12.5MB),但是大小并不是闻所未闻的,但是我正在使用的服务器只有1G的内存(如果有帮助,则为Amazon 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
为什么sudo在此命令中使用?
查尔斯·格林

1
我没收到“杀人”消息
Aphire

3
Ypu可以尝试使用参数限制用于像素缓存的内存-limit memory 64MiB(32MiB可能太小了。默认值为1.5GiB)。并且它应该为您提供一些描述性输出,以防失败。
dadexix86 '16

2
尝试运行命令并strace在命令前面附加命令,查看进行了哪些系统调用以及抛出的错误。让我们知道
Sergiy Kolodyazhnyy 2016年

2
做完了 很高兴您解决了问题!可用输出确认交换已关闭,文件信息确认该文件不是错误标识的文件。很好编辑!+1
极客长老

Answers:


7

我假设您的RAM用完了。您可以watch cat /proc/meminfo在进程运行时通过进行验证。

您可能没有足够的RAM和/或SWAP来完成任务。

由于低内存条件,请确保交换已打开,swapon -a并且如果系统上未设置交换,请在未使用的磁盘空间上为交换创建一个分区并启用它。这可能会解决问题。有一个很好的答案被@Takkat就怎么做,在这里如果你没有访问划分各服务器也可以使用一个交换文件的交换


1
OP是关于云服务器的,创建交换分区可能不是一种选择。您也可以添加如何添加新的交换文件
user.dz

@Sneetsher那就是我所做的,很好的评论
Aphire

@Sneetsher从问题中的数据(至少对我而言)尚不清楚(至少对我而言),但是您指出了一个要点。编辑答案。
极客长老

@ElderGeek,实际上它不是突出显示的Amazon EC2 t2.micro,我也编辑了问题以使之清楚,也添加了标签以便于链接到其他相关问题。
user.dz

@Sneetsher我现在看到了。感谢你付出的努力!
极客长老

5

通过添加适当的交换,解决了该问题中的问题。为了完整起见,让我总结一下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图像上正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.