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

8

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

但是,ImageMagick不断尝试写临时文件,这要么由于测试中断/失败而填满我的测试系统,要么在磁盘极度缓慢的系统上引起问题:这是一个奇怪的限制,但我的许多转换主机都是类似嵌入式系统的块设备,对任何操作的响应都非常缓慢,即使是stat()也是如此。

问题:

  1. 是否有一种方法可以配置ImageMagick在图像处理过程中不接触磁盘?假设ImageMagick将使用的所有必需模块已加载,并且将不使用将处理任务分配给与文件系统交互的子进程的任何ImageMagick功能。

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

我使用C ++或Perl ImageMagick API进行转换,而不是使用convert实用程序。但是,如果另一个绑定支持此功能,则可以切换平台。

我尝试过的

  • 我已将MAGICK_TEMPORARY_PATH设置为各种位置,包括POSIX上的/dev/null/dev/null有时似乎有效,但我的目标系统不是POSIX,因此我不确定是否可以依靠它。与愚弄临时文件管理系统不同,我更喜欢某些可以信任以在第一次禁用临时文件需要的东西。
  • 我使用了registry:temporary-path选项,结果类似。
  • 将各种临时路径选项设置为不存在/无法使用的位置(例如/dev/null或不可写位置)通常会导致在启动我的程序的目录中创建临时文件。如果该目录不可写,即使告诉代码不要使用它,我也曾看到临时文件在系统/tmp目录中创建。这些似乎发生在异常情况下(例如segfaulting/OOMing/kill -9'd),因此我认为文件通常可能会在这些位置创建,但通常会被清除。

能否创建一个内存磁盘并将 /tmp 放在其中(在两次连续的启动之间,您销毁 RAM 磁盘,重新创建/重新挂载它)?如果不行,是否可以从脚本中启动您的程序,在您的应用程序终止后删除 /tmp? - Adrian Colomitchi
可以使用ramdisk选项;也可以使用和清除/dev/shm或类似的选项。这两种选项都需要代码处理之前硬件中止(崩溃、段错误等)运行留下的混乱,以及后续运行必须清理它,因此并不理想。自动清理/tmp并没有什么作用,因为文件系统访问仍然必须发生(并减慢所有操作)。 - Zac B
请查看完整的环境变量列表。也许尝试将MAGICK_DISK_LIMIT设置为零并增加MAGICK_MEMORY_LIMIT - Finbar Crago
增加内存限制似乎有些帮助,但我更感兴趣的是在所有情况下避免使用临时文件——即使需要更多内存,失败也比较可取。 - Zac B
2个回答

2

关键是将MAGICK_DISK_LIMIT=0设置,并将MAGICK_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超出了内存限制,它将会显示以下消息并停止运行:

"out of memory"。

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

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

0

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

/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)中,我必须像上面那样增加内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接