gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:59:12 26 4
gpt4 key购买 nike

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

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

问题:

  1. 有没有一种方法可以将 ImageMagick 配置为在图像处理期间不接触磁盘?假设 ImageMagick 将使用的所有必需模块都已经加载,并且没有任何 ImageMagick 功能将处理外包给子进程与文件系统对话将被使用。

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

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

我尝试过的

  • 我已将 MAGICK_TEMPORARY_PATH 设置到不同的位置,包括 POSIX 上的 /dev/null/dev/null 有时似乎可以工作,但我的目标系统不是 POSIX,所以我不确定我是否可以依靠它。与其欺骗临时文件管理系统,我更喜欢我可以信任的东西来首先禁用对临时文件的需求。
  • 我使用了 registry:temporary-path 选项,结果相似。
  • 将各种临时路径选项设置为不存在/不可用的位置(例如 /dev/null 或不可写的位置)通常会导致在我的程序所在的目录中创建临时文件推出。如果该目录不可写,我已经看到在系统 /tmp 目录中创建了临时文件,即使代码被告知不要使用它。这些似乎在特殊情况下发生(例如段错误/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 的默认限制

关于c++ - 如何配置 ImageMagick 不使用任何临时文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com