生信學習入門后,我們都掌握了如何在后臺運行命令夏跷。一般我們可以通過for loop
哼转,將一系列的命令逐一運行。但是這樣的運行方式槽华,效率比較低壹蔓,服務器很多線程都沒有被用上。另外如果你要運行成百上千的命令猫态,這將會耗費你很多很多的運行時間佣蓉。
那如何解決這個問題呢,今天給大家介紹一下并行運行的工具GNU-Parallel
亲雪。
工具簡介和安裝
GNU parallel是一種Shell工具勇凭,用于使用一臺或多臺計算機并行執(zhí)行作業(yè)。作業(yè)可以是單個命令义辕,也可以是每一行運行的小腳本虾标。典型的輸入是文件列表。
下面進行安裝:
wget http://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
tar xjf parallel-latest.tar.bz2
cd parallel-20200222
./configure
make install
基本用法
首先看看一個例子
###輸入
seq 1 5 | parallel -j 4 echo
###輸出
1
2
3
4
5
在這里灌砖,我們首先打印從1到5的數(shù)字序列璧函,然后將此數(shù)據(jù)通過管道傳遞到parallel
。我們提供了echo
將在-j=4
四個作業(yè)之間并行運行基显。
我們最常使用的方式是蘸吓,將需要運行的命令寫到一個文本里,具體格式是每行一個你需要執(zhí)行的命令:
parallel -j 18 cmd.list
如果我們只想輸出運行的命令撩幽,看看它是否符合我們的期待库继,可以使用--dry-run
選項:
###輸入
seq 1 5 | parallel --dry-run -j 4 echo
###輸出
echo 3
echo 4
echo 5
echo 2
echo 1
可以看到結(jié)果并不是按照數(shù)字的順序來展示的,因為所有運行的命令都花費相同的時間窜醉,通常輸出時候都是以不同順序輸出的制跟。我們可以使用-k
選項,強制其按照先進先出就行輸出:
seq 1 5 | parallel -k --dry-run -j 4 echo
echo 1
echo 2
echo 3
echo 4
echo 5
關(guān)于 -j
的一些用法:
parallel -j 100% # 使用全部100%的線程
parallel -j -1 # 使用總線程減一的線程數(shù)
如何使用:::
:::
可以用來替代管道酱虎,比如:
#原命令
seq 1 5 | parallel -j 4 -k echo
#替代命令
parallel -j 4 -k echo ::: `seq 1 5`
:::
還可以使用文件中的內(nèi)容作為運行的輸入變量:
### 在文件中包含著一行一個的輸入變量
cat my_args.txt
1
2
3
4
5
###輸入命令
parallel -j 4 -k echo :::: my_args.txt
###輸出結(jié)果
1
2
3
4
5
另外如果你需要輸入多個參數(shù)雨膨,可以使用:::
和::::
,將參數(shù)進行組合《链看看具體例子:
#輸入命令
parallel --dry-run -k -j 4 Rscript run_analysis.R {1} {2} ::: `seq 1 2` ::: A B C
#輸出結(jié)果
Rscript run_analysis.R 1 A
Rscript run_analysis.R 1 B
Rscript run_analysis.R 1 C
Rscript run_analysis.R 2 A
Rscript run_analysis.R 2 B
Rscript run_analysis.R 2 C
Parallel與functions結(jié)合
在某些情況下聊记,您想執(zhí)行一系列命令撒妈。例如,下面的代碼計算DNA互補序列的ATCG數(shù)排监。
echo "ATTA" | tr ATCG TAGC | \
python -c "import sys; o=sys.stdin.read().strip(); print(o, o.count('T'), o.count('G'), o.count('C'), o.count('A'))"
使用該function有兩個操作:
###定義好函數(shù)
function count_nts {
# $1 is the first argument passed to the function
echo $1 | tr ATCG TAGC | \
python -c "import sys; o=sys.stdin.read().strip(); print(o, o.count('T'), o.count('G'), o.count('C'), o.count('A'))"
}
# export函數(shù)
export -f count_nts
###執(zhí)行parallel
parallel -j 4 count_nts ::: TAAT TTT AAAAT GCGCAT | tr ' ' '\t'
今天的介紹就到這里結(jié)束了狰右,Parallel
是一個很強大的工具,只要使用好它舆床,會讓你數(shù)據(jù)分析運行的速度棋蚌,事半功倍。