使用 shell 腳本並行執行具有不同輸入的同一文件的多個副本
假設我有一個文件“Analysis.C”,它以數據文件作為輸入。數據文件命名為“a.00001.txt”到“a.01000.txt”。循環遍歷所有文件的一種方法是編寫一個 shell 腳本,在該腳本中,我
sed
在從 0001 到 1000 的迭代中更改“Analysis.C”中的輸入文件名。但是,我必須一次執行一個輸入文件.我想要的是並行執行文件“Analysis.C”的多個實例,它在每個實例中採用不同的輸入(這裡的約束是我可以在我的 PC 上備用的核心數量,我想),並執行不同的同時實例。我怎麼做?
使用 GNU Parallel,您可以這樣做:
parallel analysis.C ::: *.txt
或者,如果您有很多
.txt
-files:printf '%s\0' *.txt | parallel -0 analysis.C
它將預設為每個 CPU 執行緒執行一個作業。這可以
-j20
針對 20 個並行作業進行調整。與 - 解決方案相反,
parallel.moreutils
您可以對輸出進行後處理:輸出是序列化的,因此您永遠不會看到來自兩個作業混合的輸出。GNU Parallel 是一個通用的並行器,可以輕鬆地在同一台機器上或在您可以通過 ssh 訪問的多台機器上並行執行作業。
如果您想在 4 個 CPU 上執行 32 個不同的作業,那麼並行化的直接方法是在每個 CPU 上執行 8 個作業:
GNU Parallel 會在完成後生成一個新程序 - 保持 CPU 處於活動狀態,從而節省時間:
安裝
出於安全原因,您應該使用軟體包管理器安裝 GNU Parallel,但如果 GNU Parallel 沒有為您的發行版打包,您可以進行個人安裝,這不需要 root 訪問權限。這樣做可以在 10 秒內完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有關其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README
學到更多
查看更多範例:http ://www.gnu.org/software/parallel/man.html
觀看介紹影片:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
瀏覽教程:http ://www.gnu.org/software/parallel/parallel_tutorial.html
閱讀本書:https ://doi.org/10.5281/zenodo.1146014
註冊電子郵件列表以獲得支持:https ://lists.gnu.org/mailman/listinfo/parallel