2017-06-05 117 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

注意:使用标签来缩进文件

此外,名称中带有空格的文件拿下没有工作。