在调整大图像大小时,PHP ImageMagick使用10gb~内存

时间:2014-10-20 12:29:44

标签: resize imagemagick ram

当我尝试使用ImageMagick软件调整像30,000px x 20,000px的非常大的图像时,我遇到了问题。但我没有使用RAM。我有8GB,但软件需要大约10GB~。我需要使用RAM中的所有数据。我尝试了两种选择:

1使用转换,写入不同的图像文件:

convert -resize 90% source.jpg destination.jpg
  1. 使用 mogrify 覆盖原始图像文件

    mogrify -resize 90%source.jpg

  2. 也许有人知道如何使用更少的记忆或其他技巧。

    有关Imagemagick的更多信息:http://www.imagemagick.org/script/mogrify.php

3 个答案:

答案 0 :(得分:3)

如果您尝试在缓存到磁盘之前配置ImageMagick的内存策略以使用更多RAM,请通过修改policy.xml或设置环境变量来定义AREA限制。

在环境中设置内存限制

这可能是一次性流程的最快捷方式。

MAGICK_AREA_LIMIT=8GB convert -resize 90% source.jpg destination.jpg

还尝试调整其他环境变量

  • MAGICK_MAP_LIMIT - 为像素缓存分配的最大内存映射量(以兆字节为单位)。
  • MAGICK_MEMORY_LIMIT - 从堆中为像素缓存分配的最大内存量(兆字节)。

使用Policy.xml

设置内存限制

修改policy.xml目录下的{$PREFIX}/lib/ImageMagic-X.X.X/config

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)+>
<!ELEMENT policy (#PCDATA)>
<!ATTLIST policy domain (delegate|coder|filter|path|resource) #IMPLIED>
<!ATTLIST policy name CDATA #IMPLIED>
<!ATTLIST policy rights CDATA #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>
<policymap>
  <policy domain="resource" name="memory" value="8GB"/>
  <policy domain="resource" name="map" value="8GB"/>
  <policy domain="resource" name="area" value="8GB"/>
</policymap>

验证

无论您选择哪种方法,都可以通过运行identify实用程序进行验证。

$ identify -list resource

  File       Area     Memory        Map       Disk   Thread  Throttle       Time
--------------------------------------------------------------------------------
  1920        8GB        8GB        8GB  unlimited        1         0  unlimited

答案 1 :(得分:1)

目前还不清楚你想要实现的整体目标,但你可以在阅读的同时调整这样的图像并且它应该占用更少的内存:

convert source.jpg'[15000x10000]' destination.jpg

答案 2 :(得分:0)

编辑policy.xml下的/etc/ImageMagick/policy.xml

就我而言,它使用的内存超过2GiB,但是您可以在此处进行限制,以便脚本应在提供的限制下运行。我将其设置为mapmemory的512MiB。