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