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

时间:2016-08-29 15:35:01

标签: c++ perl imagemagick temporary-files tmp

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

然而,ImageMagick不断尝试编写临时文件,这些文件由于测试中止/失败而填满我的测试系统,或者在磁盘速度极慢的系统上引起问题:这是一个奇怪的约束,但我的很多转换主机是类似嵌入式的系统,其块设备极其缓慢响应任何操作,甚至是stat()

问题:

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

  2. 这样做有什么副作用?我很好地处理了不适合内存失败的处理,而不是回到磁盘上。

  3. 我使用C ++或Perl ImageMagick API进行转换,而不是convert实用程序。但是,如果另一个绑定对此有支持,那么我就是很好的切换平台。

    我尝试过的事情

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

2 个答案:

答案 0 :(得分:1)

诀窍是将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的默认限制

答案 1 :(得分:0)

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

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

def create_staff(self, first_name, last_name, email, qualification, department, password=None, last_login=None):
    # code cut for brevity
    staff = Staff(first_name=first_name, last_name=last_name,
                  email=self.normalize_email(email),
                  qualification=qualification, department=department,
                  last_login=last_login)
    

版本之间存在差异:8:6.9.7.4 + dfsg-16ubuntu6.9(Ubuntu 18.04)在不写入临时文件且使用256MiB的情况下默认工作,但版本为8:6.9.10.23 + dfsg-2.1ubuntu11.2( Ubuntu 20.04)我必须如上所述增加内存。