使用多个 CPU 内核优化目录中的映像



我在一个目录中有几个PNG图像,我正在使用optipng来优化和减小图像大小。问题是优化所有文件需要很长时间。

有一个四核处理器,我注意到optipng只使用一个核当我优化目录时。

这是我正在使用的代码:

ls -1 | while read line
do 
    optipng -o7 "$line"
done
是否可以

在读取目录时并行执行四个不同文件的optipng

还有另一种解决方案涉及xargs

find some/dir/ -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7

其中-P 4启动 4 个并行进程,-n 1每个进程最多使用一个文件名。

或者,如果您有换行符分隔的文件名,请使用:

find some/dir/ -iname '*.png' | sort | xargs -d \n -n 1 -P 4 optipng -o7

感谢Joe Lencioni在博客上的评论。


更新:我编写了一个 shell 脚本来并行调用多个图像的 zopflipng(它提供了比 optipng 更高的压缩):zopflipng_in_place

我将optipng与GNU parallel一起使用(包含在每个Linux发行版中):

parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png

优点:您有一个指示进度的条形图。

您需要

将每个optipng放在后台才能使用四个内核,并使用计数器n来跟踪它们的数量。在这种情况下,我使用的是n=4,因此在给定时间将运行 4 个后台作业:

n=0
for image in *
 do
  optipng -o7 "$image" &
  n=$(( $n + 1 ))
  [ "$n" -eq 4 ] && n=0 && wait
done

不要同时运行许多 bg 作业(保持低n),否则会有性能损失。根据需要修改代码,尤其是 for image in * 中的*模式。

最新更新