並行化檔案列表上的重複任務
如果你使用更多的計算機資源(即 CPU 和 RAM),則可以更有效地執行許多重複性作業。下面是並行執行多個作業的示例。
假設你有一個 < list of files >
,比如來自 ls
的輸出。另外,讓這些檔案被 bz2 壓縮,並且需要對它們執行以下任務順序。
- 使用
bzcat
將 bz2 檔案解壓縮到 stdout - 使用
grep <some key word>
的特定關鍵字的 Grep(例如過濾器)行 - 使用
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