我希望自动将一些(imagemagick图像处理)批处理作业限制在单个逻辑处理器的后台运行,以尽量减少对其他实时应用程序性能的影响。
我拼凑在一起的方法是使用命令行参数作为标志。当批处理文件首次启动而没有命令行参数(并且没有亲和力)时,它将再次启动,并将亲缘关系设置为最后一个逻辑处理器,添加一个伪参数以指示已设置亲和关系并继续执行主体批处理作业:
REM START OF THISBATCHFILE.CMD
IF NOT [%1]==[] GOTO AFFINITY_SET
SET LAST_PROCESSOR=1
FOR /L %%I IN (2,1,%NUMBER_OF_PROCESSORS%) DO SET /A LAST_PROCESSOR*=2
PROCESSOR = %LAST_PROCESSOR%
START /B /AFFINITY %LAST_PROCESSOR% THISBATCHFILE.CMD DUMMY_ARGUMENT
EXIT 0
:AFFINITY_SET
REM Batch Job Starts Here
REM ImageMagick command 1
REM ImageMagick command 2
REM ...
REM ImageMagick command N
REM Batch Job Ends Here
EXIT 0
这似乎可以在我的4核Win8.1系统上运行,将批处理作业限制在最后一个(第4个)逻辑处理器上。我的问题是 - 有更好的方法吗?
答案 0 :(得分:0)
您可以通过3种不同的方式控制ImageMagick使用的资源...通过命令行启动流程,通过环境变量和配置文件。对于您的用例,我建议您使用环境变量,这比更改convert
的每次调用都要容易,并且比编辑系统配置文件更灵活,无论您的实时应用程序是否是您的实时应用程序,它都会一直限制ImageMagick运行
您可以通过运行以下命令查看可以更改的资源及其当前值:
identify -list resource
<强>输出强>
Resource limits:
Width: 214.7MP
Height: 214.7MP
Area: 17.18GP
Memory: 8GiB
Map: 16GiB
Disk: unlimited
File: 192
Thread: 1
Throttle: 0
Time: unlimited
我怀疑你想减少线程数(并行性)并设置一小段时间来偶尔放弃CPU。你也可以改变允许使用ImageMagick的内存。
因此,具体而言,我会尝试在一堆ImageMagick命令之前设置限制:
...
...
SET MAGICK_THREAD_LIMIT=1
SET MAGICK_THROTTLE=50
REM Batch Job Starts Here
REM ImageMagick command 1
REM ImageMagick command 2
REM ...
或者,您可以在每次调用convert
时指定限制,如下所示:
convert -limit thread 1 input.png ... <processing> ... output.png
如果查看初始限制列表中的文件数,可以看到它是192
。我可以通过在单个命令的持续时间内将数字文件限制为2
来演示我所说的内容,而我使用的命令是列出限制的命令...
convert -limit file 2 -list resource info:
Resource limits:
Width: 214.7MP
Height: 214.7MP
Area: 17.18GP
Memory: 8GiB
Map: 16GiB
Disk: unlimited
File: 2 <--- 2 files only
Thread: 1
Throttle: 0
Time: unlimited
因此,对于列出我可以打开多少文件的命令的持续时间,我将打开文件的数量限制为2
并显示出来。