如何使用Image Magic并行批量转换多个子目录中的数千张图片

5

我有大约100个子目录,每个目录下有大约1000个文件。 我想使用Image MagickBASH for Win10(即LINUX脚本)下将JPG转换为PNG。 我的脚本速度很慢,我能加快它吗?

find . -type f -name '*.jpg' -exec sh -c '
    orgfile="$0"
    newfile="$(echo "$0" | sed 's/.jpg/.png/')"
    echo $orgfile $newfile
    convert $orgfile -unsharp 0x5 $newfile
    rm $orgfile
' {} \;

我喜欢循环处理过程,因为转换是一系列过程中的第一个,所以输入和输出名称可以被重复使用。然而它很慢,echo用于反馈(改为每个目录?)
在相关的帖子中提供了以下解决方案
# Runs these conversions serially
ls *.NEF | sed 's#.NEF##' | xargs -I^ convert ^.NEF ^.jpg
# Runs these conversions with 8 different processes
ls *.NEF | sed 's#.NEF##' | xargs -P8 -I^ convert ^.NEF ^.jpg

但是另一篇文章警告说,并行处理可能会减缓系统的速度。

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

我觉得我正在陷入高级BASH脚本和并行处理中,我对xargs一无所知。

顺便说一下,串行运行使用约25%的PC资源。

4个回答

3
如果 mogrify 只使用一个 CPU,则可以使用 GNU Parallel 进行并行处理:
parallel mogrify -unsharp 0x5 -format png ::: *.jpg

如果文件列表对于命令行来说太长了:

ls | parallel mogrify -unsharp 0x5 -format png {} 

多个子目录:

find subdir1 subdir2 -name '*.jpg' | parallel mogrify -unsharp 0x5 -format png {} 

2
使用ImageMagick的内联批处理工具,称为mogrify。
mogrify -unsharp 0x5 -format png *.jpg

你无法在 Shell 中更快地编写。对于递归转换,请使用 Bash 的 globbing 功能:

shopt -s globstar
mogrify -unsharp 0x5 -format png **/*.jpg

在我的机器上,mogrify 看起来只运行一个进程,尽管我有多个核心。使用像 parallel 这样的工具,肯定可以通过并行运行来加速 mogrify - BallpointBen
看起来它一次只运行一个进程 - 它确实只有一个进程,但是通过线程使用所有可用的CPU核心。在一个进程内使用多线程比实际上生成单独的进程更有效率。 - RReverser

0

我有稍微不同的方法。我不使用xargs,而是将所有需要处理的文件收集到单个文本文件中。然后对其进行随机排序(使用split.exe)以平均分配工作量,将其分成8个相等的部分(使用shuf.exe),并并行运行。以下是此操作的Windows批处理代码:

dir /s/b *.jpg > allfiles
shuf allfiles -o allfiles
split -n l/8 allfiles
for %%i in (xaa xab xac xad xae xaf xag xah) do (
    start /separate /low /min magick mogrify -verbose -format png @%%i 
)
:loop
tasklist.exe | grep -i "magick.exe\|mogrify.exe" > nul
echo %time% %errorlevel% processing...
if %errorlevel%==0 goto loop

del xa?

还有一个循环检查是否所有操作都已完成。虽然split和grep可以由unxUtils提供,但shuf仅在cygwin中可用。我跳过了删除旧文件的部分,但this应该会有所帮助。


0

抱歉Igor,我是这个网站的新手,无法在您的帖子中发布格式化的评论。

Mogrify比xargs稍慢,但打字更容易。 任务管理器显示Mogrify的磁盘利用率更高,CPU利用率也更高,但“波动”更大(100%下降,而xargs保持在约50%)

我的结论是,如果只有少量文件,请使用Mogrify。 如果要运行整夜,请使用xargs以获得更凉爽的电脑。

我的时间测试是针对一个子目录。

find . -type d -exec sh -c '
   subdir="$0"
   echo $subdir

   #test mogrify
   time mogrify -unsharp 0x5 -format png "${subdir}/*.jpg"
   #1011.65user 30.07system 7:47.85elapsed 222%CPU

   for f in "${subdir}/*.jpg"; do echo $f ${f%jpg}png; done| time xargs -n 2 -P 8 -i convert ifile/ '{}' -unsharp 0x5 ofile/ '{}'
   #991.95user 29.35system 7:22.46elapsed 230%CPU
' {} \;

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