繁体   English   中英

如何配置 ImageMagick 不使用任何临时文件?

[英]How can I configure ImageMagick to not use any temporary files?

我正在尝试在不接触文件系统的情况下运行 ImageMagick:从内存/网络读取图像数据,并作为blob写回套接字。

然而,ImageMagick 不断尝试编写临时文件,这要么由于中止/失败的测试而填满我的测试系统,要么导致磁盘速度极慢的系统出现问题:这是一个奇怪的限制,但我的许多转换主机都是嵌入式系统块设备对任何操作的响应都非常慢,甚至是stat() s。

问题:

  1. 有没有办法配置 ImageMagick 在图像处理过程中不接触磁盘?假设 ImageMagick 将使用的所有必需模块都已经加载,并且将处理输出到与文件系统对话的子进程的 ImageMagick 功能都不会被加载使用。

  2. 这样做有什么副作用? 我可以接受不适合内存失败的处理,而不是回退到磁盘。

我正在使用 C++ 或 Perl ImageMagick API 进行convert ,而不是使用convert实用程序。 不过,如果另一个绑定支持这一点,我可以很好地切换平台。

我试过的

  • 我已将MAGICK_TEMPORARY_PATH设置为不同的位置,包括 POSIX 上的/dev/null /dev/null有时似乎有效,但我的目标系统不是 POSIX,所以我不确定我是否可以指望它。 而不是愚弄临时文件管理系统,我更喜欢我可以信任的东西,首先禁用对临时文件的需求。
  • 我使用了registry:temporary-path选项,结果相似。
  • 将各种临时路径选项设置为不存在/不可用的位置(例如/dev/null或不可写的位置)通常似乎会导致在启动我的程序的目录中创建临时文件。 如果该目录不可写,我已经看到系统/tmp目录中创建了临时文件,即使代码被告知不要使用它。 这些似乎发生在特殊情况下(例如 segfaulting/OOMing/ kill -9 'd 情况),所以我认为文件可能会在这些地方正常创建,但通常会被清理。

诀窍是将MAGICK_DISK_LIMIT=0MAGICK_AREA_LIMIT / MAGICK_AREA_LIMIT设置为大于程序所需的最大内存的值。

#!/usr/bin/perl
BEGIN {
    $ENV{'MAGICK_DISK_LIMIT'  }='0';
    $ENV{'MAGICK_AREA_LIMIT'  }='1Mb';
    $ENV{'MAGICK_MEMORY_LIMIT'}='1Mb';
}

use Image::Magick;    
my $img = Image::Magick->new();
my $err = $img->Read('in.png');
die $err if $err;

如果 ImageMagick 超过此内存限制,它将死,并显示如下消息:

Exception 450: Memory allocation failed `in.png' @ error/png.c/MagickPNGErrorHandler/1645 at ./imagemem.pl line 11.

您可以通过运行identify -list resource查看 ImageMagick 的默认限制

使用命令行工具时,我不得不增加配置文件中的内存:

/etc/ImageMagick-6/policy.xml 中:

<!-- DEFAULT: <policy domain="resource" name="memory" value="256MiB"/> -->
<policy domain="resource" name="memory" value="1024MiB"/> 

版本存在差异:8:6.9.7.4+dfsg-16ubuntu6.9(Ubuntu 18.04)默认工作,不写入临时文件,256MiB,但8:6.9.10.23+dfsg-2.1ubuntu11.2(Ubuntu 20.04)我不得不像上面那样增加内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM