2014-02-15 81 views
3

我在一個目錄中有幾個PNG圖像,我正在使用optipng來優化和縮小圖像大小。問題是優化所有文件需要很長時間。使用多CPU核心優化目錄中的圖像

我有一個四核處理器,我注意到當我優化目錄時,optipng只使用單個核心 。

這是代碼我使用:

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

是否可以並行執行optipng四個不同的文件在讀取目錄?

回答

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 *中的*模式。

8

還有另一種涉及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

+0

出於好奇,爲什麼你想限制它每個進程一個文件名? – UpTheCreek

+1

@UpTheCreek:'optipng'支持多個文件名,所以我可以使用它。但是,爲每個進程分配一個文件應該會導致更好的分配。考慮2個並行進程(每個進程都在一個CPU內核上),並考慮4個文件:2個非常慢(非常大),2個非常快。如果我爲每個進程分配2個文件,則可能發生兩個非常慢的文件在同一個CPU內核上排隊,而另一個內核將空閒。爲每個進程分配1個應該不會留下任何CPU內核空閒,直到沒有文件剩餘爲止。 –

+1

只是嘗試了一些實驗,並獲得了更高的性能,通過高n值(在我的情況下是50)。用'-n 50 -P 3',我在3個內核上獲得了100%的可靠CPU。使用'-n 1 -P 3'時,CPU使用率已經遍佈全球(可能是因爲設置/拆除更多進程的開銷較高)。 – UpTheCreek

1

我用使用OptiPNG與GNU平行(包括在每個linux發行版):

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

優勢:您有一個指示進度的欄。

+0

@MarcusJ名稱爲'file1.png file2.png morefile * .png',其中只是示例文件名。將它們替換爲您的文件名稱。如果您在當時需要多個文件(我認爲它超過4000個),則必須分幾步完成。將部分文件移至不同的子目錄。 – erik