並行化檔案列表上的重複任務

如果你使用更多的計算機資源(即 CPU 和 RAM),則可以更有效地執行許多重複性作業。下面是並行執行多個作業的示例。

假設你有一個 < list of files >,比如來自 ls 的輸出。另外,讓這些檔案被 bz2 壓縮,並且需要對它們執行以下任務順序。

  1. 使用 bzcat 將 bz2 檔案解壓縮到 stdout
  2. 使用 grep <some key word> 的特定關鍵字的 Grep(例如過濾器)行
  3. 使用 gzip 將輸出連線到一個單個 gzip 壓縮檔案中

使用 while 迴圈執行它可能看起來像這樣

filenames="file_list.txt"
while read -r line
do
name="$line"
     ## grab lines with puppies in them
     bzcat $line | grep puppies | gzip >> output.gz
done < "$filenames"

使用 GNU Parallel,我們可以簡單地一次執行 3 個並行作業

parallel -j 3 "bzcat {} | grep puppies" ::: $( cat filelist.txt ) | gzip > output.gz

當檔案數量和檔案大小很大時,此命令簡單,簡潔,高效。工作由 parallel 啟動,選項 -j 3 啟動 3 個並行作業,並且輸入到並行作業由:::接收。輸出最終輸送到 gzip > output.gz