2014-01-10 66 views
3

我正在通過GNU Parallel totorial。在「多個參數」一節中,有下面的例子(注:num30000是有數字1的文本文件30000上連續線):爲什麼5個作業在本教程中使用GNU Parallel --jobs 4選項運行?

爲了更好的並行GNU並行可以分發所有的參數滿足文件結束時的並行作業。

並行運行4個就業機會將參數的最後一行分成共導致5個職位的4個作業:

cat num30000 | parallel --jobs 4 -m echo | wc -l 

輸出:

5 

我的問題是:爲什麼我們預計有5個工作嗎?我明顯錯過了一點,雖然我不知道它是否重要。我預計4個作業,因爲30,000整除4.我決定跑後發佈此問題如下:

cat num30000 | parallel --jobs 4 -m echo | colrm 12 

導致:

1 2 3 4 5 6 
23696 23697 
25273 25274 
26850 26851 
28427 28428 

這看起來對我來說,第一echo命令通過了最初的23,695個論點。然後,剩餘的部分被分成4個工作,參數數量分別爲1577,1577,1577和1574.我是否誤解了並行調用應該做的事情?謝謝!

回答

3

這個答案的價格是幫助我以一種方式改進這個例子,這樣你就可以在一讀時理解它。

所以會發生什麼是以下幾點:

GNU並行計算出的極限是131071.然後看到很多的工作是如何當前正在運行(0)。是否少於並行運行的作業數量(4):然後它讀取高達131071限制的參數並開始該作業。這是第一份工作。

現在GNU Parallel再次讀取參數。這一次它讀取所有其餘的文件並結束文件。 「哦,」GNU Parallel認爲。 「如果這是文件的結尾,那麼我將把所有參數分散在所有作業槽(4)上。」所以它需要所有其餘的參數並將它們分散到4個作業中。然後啓動3個工作。現在有4個工作正在運行。

其中一個正在運行的作業完成,提供一個免費的作業槽;所以GNU Parallel開始了最後的工作。

如果你有4個核心和100個參數,這個設計的原因更加清楚:100個參數很容易放在一行上,但是通常在4核心機器上運行4個作業有25個參數將比運行速度快1個工作有100個參數。

+0

我很高興支付罰款,我的意思是價格:)但是,我可能仍然沒有足夠的理解這樣做。這裏是一個嘗試:「並行請求」4個作業將最後一行參數分成4個作業,因爲'cat num30000 | parallel -m echo'創建兩行參數,第一個作業從第一個最大長度開始(第23695行),第二行有EOF標記,因此GNU Parallel將這些參數在接下來的4個作業中儘可能均勻分佈,總共有5個作業......與命令head -n 20000 num30000 | parallel --jobs 4 -m echo | wc -l'「 –

+0

我的newby混淆的一部分來自於不理解stdin管道有EOF。我也不知道如何將stdin的所有行(不僅僅是具有EOF的行)平行分割成4個作業。感謝您在GNU Parallel上的出色工作! –

3

我現在在理解語言。參數-m要求並行操作,以儘可能多地將參數放在命令行上。我的131071個字符的限制意味着共有兩個命令echo生成。第一個有23695個。第二個有剩下的。 --jobs 4參數僅影響第二個命令。這就是「最後一個參數」的教程。所以,我明白爲什麼總共有5個工作。但是,我不明白爲什麼--jobs隻影響最後一個論點,但這不是我問的問題。

相關問題