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

时间:2014-02-15 17:32:11

标签: linux image bash terminal do-while

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

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

这是我正在使用的代码:

ls -1 | while read line
do 
    optipng -o7 "$line"
done

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

3 个答案:

答案 0 :(得分:9)

还有另一个涉及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 comment on a blog


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

答案 1 :(得分: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

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

答案 2 :(得分:2)

我使用optipng和 GNU parallel (包含在每个linux发行版中):

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

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

相关问题