我在一個目錄中有幾個PNG圖像,我正在使用optipng
來優化和縮小圖像大小。問題是優化所有文件需要很長時間。使用多CPU核心優化目錄中的圖像
我有一個四核處理器,我注意到當我優化目錄時,optipng
只使用單個核心 。
這是代碼我使用:
ls -1 | while read line
do
optipng -o7 "$line"
done
是否可以並行執行optipng
四個不同的文件在讀取目錄?
我在一個目錄中有幾個PNG圖像,我正在使用optipng
來優化和縮小圖像大小。問題是優化所有文件需要很長時間。使用多CPU核心優化目錄中的圖像
我有一個四核處理器,我注意到當我優化目錄時,optipng
只使用單個核心 。
這是代碼我使用:
ls -1 | while read line
do
optipng -o7 "$line"
done
是否可以並行執行optipng
四個不同的文件在讀取目錄?
您需要將每個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 *
中的*
模式。
還有另一種涉及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
我用使用OptiPNG與GNU平行(包括在每個linux發行版):
parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png
優勢:您有一個指示進度的欄。
@MarcusJ名稱爲'file1.png file2.png morefile * .png',其中只是示例文件名。將它們替換爲您的文件名稱。如果您在當時需要多個文件(我認爲它超過4000個),則必須分幾步完成。將部分文件移至不同的子目錄。 – erik
出於好奇,爲什麼你想限制它每個進程一個文件名? – UpTheCreek
@UpTheCreek:'optipng'支持多個文件名,所以我可以使用它。但是,爲每個進程分配一個文件應該會導致更好的分配。考慮2個並行進程(每個進程都在一個CPU內核上),並考慮4個文件:2個非常慢(非常大),2個非常快。如果我爲每個進程分配2個文件,則可能發生兩個非常慢的文件在同一個CPU內核上排隊,而另一個內核將空閒。爲每個進程分配1個應該不會留下任何CPU內核空閒,直到沒有文件剩餘爲止。 –
只是嘗試了一些實驗,並獲得了更高的性能,通過高n值(在我的情況下是50)。用'-n 50 -P 3',我在3個內核上獲得了100%的可靠CPU。使用'-n 1 -P 3'時,CPU使用率已經遍佈全球(可能是因爲設置/拆除更多進程的開銷較高)。 – UpTheCreek