2013-03-29 53 views
0

當調用下面的命令,我發現它儘管兩個磁盤,也沒有CPU,也沒有內存運行緩慢消耗太大(與頂部/ iotop選中)如何加快「find。-type f -size +0 -exec ./work.sh {} 」的通過量;「

find . -type f -size +0 -exec ./work.sh {} \; 

我選擇了這個特別的發現構建,因爲我有很多的文件(> 50k)。

內work.sh基本上是這樣的:

prefix=\"$filename\"";"\"$timestamp\"";"\" 
SED_ARG="-e 's/^/"$prefix"/'" 
zcat $1 | sed = | sed 'N;s/\n/";/' | grep -vE '"timepassed";' | eval sed "$SED_ARG" >> $logfilename 

會是什麼方式來分析或改進性能?我可能會發現等待執行程序返回每個文件,而它可能會產生下一個文件的下一個exec。

+0

什麼是'「$ SED_ARG」'? – anubhava

+0

我編輯了問題以顯示它。 – Cilvic

回答

2

分區作業分成塊,並運行它們使用shell作業控制。或者安裝GNU並行,如果這將是一件日常事情。作業控制示例:

cnt=1 
find . -type f -size +0 | 
while read fname 
do 
    zcat $fname | sed = | sed 'N;s/\n/";/' | grep -vE '"timepassed";' | 
      eval sed "$SED_ARG" >> $logfilename & 
    [ $(($cnt % 10 )) -eq 0 ] && wait 
    cnt=$(($cnt + 1)) 
done 
wait 

它一次運行10個作業。將10更改爲適合您的系統,更高的數字並不總是更好的選擇。

$((%))爲模數 - 餘 - 算術。所以當cnt是10 20 30 ... $(($ cnt%10)) 會返回零。每次該值返回零腳本呼叫等待。最後一個等待語句(在完成的單詞之下)是在循環在一個數字上結束而不是不能被10整除的情況下,例如, 52002.這是bash的全部內容。

+0

這看起來不錯,可以評論這[$(($ cnt%10))-eq 0] &&部分是如何工作的?櫃檯什麼時候減少?還有爲什麼在循環之後等待? – Cilvic

+0

這給出了一個幾乎別無選擇平行http://stackoverflow.com/questions/463963/parallel-processing-from-a-command-queue-on-linux-bash-python-ruby-whateve – Cilvic

+0

爲什麼你會做什麼,但加?你從1到5萬。每10分鐘你就等10個工作完成。 –

0

我想一個原因,你的執行是緩慢的,因爲你有太多的管道命令。如果我理解正確的管道命令鏈可以大大重構這樣:

zcat $1 | awk -v f="$filename" -v t="$timestamp" '$1 !~ "\"timepassed\";" { 
      printf("\"%s\";\"%s\";\"%d\";%s\n", f, t, NR, $0)}' >> $logfilename 

一旦你驗證上面的代碼片斷是做同樣的工作,你能再次嘗試你find命令看演出。

+0

非常感謝@anubhava,看起來非常好,所以更容易理解。教我好awk。不幸的是它慢了20%左右。此外,我不得不稍微改變參數的順序以匹配我編輯答案的腳本。 – Cilvic

+0

爲了加速,我們可以避免使用awk regex'/「timepasssed」; /'因爲它不是一個真正的正則表達式。只是想知道這個文本文本是否「超時」;'可以出現在一行的任何地方或開頭? – anubhava

+1

請嘗試編輯答案,看看它是否執行得更快。 – anubhava

相關問題