使用 GNU parallel 來平行運算

通常我們在使用一些簡單的 shell 工具時,都只會用到一個 CPU 核心,但對多核心的機器來說可以使用 GNU parallel 來善用所有的資源,並減少執行時間。以下舉簡單的例子來說明如何使用 GNU parallel:

檔案

very_big_file.csv,tab 分隔的檔案,裡頭是 GBIF 下載物種的資訊,這個文字檔有 34 GB

使用程式

parallel
grep
測試平台: Mac OS X 10.10, 4 cores (8 threads), 16 GB ram

測試結果

Test A

只用 grep 來擷取 "Acanthiza katherina" 的記錄

$ time grep "Acanthiza katherina" very_big_file.csv
366.08s user 16.88s system 99% cpu 6:25.09 total

總共花了 385 秒左右

Test B

$ cat Chordata_small.csv | parallel --pipe -u grep \"Acanthiza katherina\"
0.82s user 30.26s system 8% cpu 6:16.76 total

總共花了 377 秒左右,疑? parallel 似乎也沒有快到哪邊。因為這個例子中瓶頸是輸出入(從硬碟讀取資料然後丟給 grep 擷取),所以試看看每次將 100 M 行的資料轉送給 grep 同時處理:

Test C

$ cat Chordata_small.csv | parallel --pipe --block 100M -u grep \"Acanthiza katherina\"
478.78 s user 135.86 s system 486% cpu 2:06.71 total

改用 block=100M 之後,僅需要 127 秒,節省了 66% 左右的時間。

結論

如果處理的東西不複雜,也許可以用 parallel 搭配 awk/sed/grep 來做平行運算,畢竟寫個 script 只要幾分鐘,相較寫 MPI 或是 Hadoop 這類比較複雜的平行運算系統,parallel 是 CP 比較高的選擇。

Comments

comments powered by Disqus