Zac*_*c B 8 c++ perl imagemagick temporary-files tmp
我试图在不触及文件系统的情况下运行ImageMagick:从内存/网络读取图像数据,并将其作为blob写回套接字.
但是,ImageMagick不断尝试编写临时文件,这些文件由于测试中止/失败而填满我的测试系统,或者在磁盘速度极慢的系统上引起问题:这是一个奇怪的约束,但我的许多转换主机都是嵌入式系统使用块设备,响应任何操作都非常慢,甚至是stat()s.
问题:
有没有办法配置ImageMagick在图像处理期间不接触磁盘?假设已经加载了ImageMagick将使用的所有必需模块,并且没有任何ImageMagick功能将处理输出到与文件系统通信的子进程用过的.
这样做有什么副作用?我可以处理不适合内存失败的处理,而不是回到磁盘上.
我正在使用C++或Perl ImageMagick API进行转换,而不是convert实用程序.但是,如果另一个绑定支持这一点,我很好地切换平台.
我试过的
MAGICK_TEMPORARY_PATH各种各样的地方,包括/dev/nullPOSIX./dev/null有时似乎工作,但我的目标系统不是POSIX,所以我不确定我是否可以指望它.而不是愚弄临时文件管理系统,我更喜欢我可以信任的东西,首先禁用对临时文件的需求.registry:temporary-path选项,结果相似./dev/null或者不可写的位置)通常会导致在我的程序启动的目录中创建临时文件.如果该目录是不可写的,我已经看到临时文件在系统/tmp目录中创建,即使代码被告知不使用它.这些似乎发生在特殊情况下(例如segfaulting/OOMing/kill -9'd情况),所以我认为通常可以在这些地方创建文件,但通常会清理它们.小智 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;
Run Code Online (Sandbox Code Playgroud)
如果 ImageMagick 超过此内存限制,它将终止并显示如下消息:
Exception 450: Memory allocation failed `in.png' @ error/png.c/MagickPNGErrorHandler/1645 at ./imagemem.pl line 11.
Run Code Online (Sandbox Code Playgroud)
您可以通过运行查看 ImageMagick 的默认限制identify -list resource