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

The*_*ker 4 linux bash terminal image do-while

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

我有一个四核处理器,我注意到optipng在优化目录时只使用了一个核心.

这是我正在使用的代码:

ls -1 | while read line
do 
    optipng -o7 "$line"
done
Run Code Online (Sandbox Code Playgroud)

optipng在读取目录时是否可以并行执行四个不同的文件?

Den*_*aia 9

还有另一种解决方案xargs.

find some/dir/ -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7
Run Code Online (Sandbox Code Playgroud)

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

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

find some/dir/ -iname '*.png' | sort | xargs -d \\n -n 1 -P 4 optipng -o7
Run Code Online (Sandbox Code Playgroud)

感谢Joe Lencioni对博客的评论.


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


eri*_*rik 5

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

parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png
Run Code Online (Sandbox Code Playgroud)

优点:您有一个指示进度的栏。


小智 4

您需要将每个核心optipng放在后台才能使用四个核心,并使用计数器n来跟踪它们的数量。我n=4在本例中使用的是,因此在给定时间将运行 4 个后台作业:

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

不要同时运行许多 bg 作业(保持n较低),否则会降低性能。根据需要修改代码,尤其*for image in *.