2017-06-05 68 views
2

我有一個for循環,它在100個不同的輸入文件夾上運行一個Python腳本〜100次。 python腳本在2個內核上效率最高,而且我有50個內核可用。所以我想使用GNU並行在25個文件夾上運行腳本。使用GNU parallel來平行bash循環

這裏是我的for循環(工作正常,但當然是連續的),蟒蛇腳本需要一堆的輸入變量,包括它運行其上的兩個內核的-p 2的:

for folder in $(find /home/rob/PartitionFinder/ -maxdepth 2 -type d); do 
     python script.py --raxml --quick --no-ml-tree $folder --force -p 2 
done 

,這裏是我的嘗試parallelise它,它不工作:

folders=$(find /home/rob/PartitionFinder/ -maxdepth 2 -type d) 

echo $folders | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2 

我打這個問題(也許它只是許多第一,雖然)是我的folders變量不是一個列表,所以它真的只是路過的長字符串作爲的100個文件夾的腳本。

感謝所有提示。

回答

5

更換echo $folders | parallel ...echo "$folders" | parallel ...

如果沒有雙引號,shell將分析$folders中的空格,並將它們作爲單獨的參數傳遞給echo,這會導致它們打印在一行上。 parallel提供每行作爲作業的參數。

爲了避免這樣的報價問題,總之,它始終是一個好主意,管findparallel直接,使用空字符作爲分隔符:遇到包含文件名時,

find ... -print0 | parallel -0 ... 

這會甚至工作多個空格或換行符。

+0

gah!兩個簡單的方案我不會想出第一個,但應該嘗試第二個。謝謝。 – roblanf

2

您可以直接管到找到平行:

find /home/rob/PartitionFinder/ -maxdepth 2 -type d | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2 

如果你想保持在字符串中$folder,可以通過管道的回聲xargs的。

echo $folders | xargs -n 1 | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2 
0

您可以創建一個Makefile這樣的:

#!/usr/bin/make -f 

FOLDERS=$(shell find /home/rob/PartitionFinder/ -maxdepth 2 -type d) 

all: ${FOLDERS} 

# To execute the find before the all 
find_folders: 
    @ echo $(FOLDERS) > /dev/null 

${FOLDERS}: find_folders 
    @ python script.py --raxml --quick --no-ml-tree [email protected] --force -p 2 

,然後運行make -j 25

注意:使用標籤來縮進文件

此外,名稱中帶有空格的文件拿下沒有工作。