2017-06-05 17 views
2

私は100種類の入力フォルダに対して〜100回Pythonスクリプトを実行するforループを持っています。 Pythonスクリプトは2つのコアで最も効率的で、50のコアが利用できます。ですから、私は一度に25のフォルダ上でスクリプトを実行するためにGNU並列を使用したいと思います。GNU並列を使用してループのためのbashを並列化する

はここ(正常に動作しますが、もちろんの連続である)ループのための私ですが、Pythonスクリプトは、二つのコア上で実行さ-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 

、ここでは、への私の試みです動作しない、それを並列化:

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 ...を交換してください。

二重引用符を使用しない場合、シェルは$foldersのスペースを解析し、別の引数としてechoに渡します。これにより、1行に出力されます。 parallelは、各行をジョブの引数として提供します。完全な引用の問題を回避するために

、それが直接パイプfindparallelに常に良いアイデアで、区切り文字としてNULL文字を使用します。

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

これは、含まれているファイル名に遭遇した場合でも動作します複数のスペースまたは改行文字。

+0

gah! 2つの簡単なソリューション。私は最初のことを考えなかっただろうが、2番目を試してみるべきだった。ありがとう。 – 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

を実行するには、注意してください:あなたのファイルでインデントに使用タブ

また、名前ウォンにスペースを持つファイル仕事はありません。

関連する問題