使用gnu并行以平行bash进行循环



我有一个用于循环的循环,该循环在100个不同的输入文件夹上运行python脚本〜100次。Python脚本在2个内核上最有效,我有50个核心。因此,我想使用gnu平行一次在25个文件夹上运行脚本。

这是我的循环(工作正常,但当然是顺序的(,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个文件夹的长字符串作为{}传递给脚本。

所有提示都非常感激。

echo "$folders" | parallel ...替换echo $folders | parallel ...

没有双引号,shell解析了 $folders中的空间,并将它们作为单独的参数传递给 echo,从而使它们在一行上打印出来。parallel将每行作为参数作为作业。

为了避免完全引用问题,直接将find送到parallel并将NULL字符作为定界符始终是一个好主意:

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

即使遇到包含多个空格或newline字符的文件名时,这也将起作用。

您可以直接找到并行的管道:

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

如果要将字符串保存在$folder中,则可以将Echo置于Xargs。

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

您可以创建一个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 $@ --force -p 2

然后运行make -j 25

请小心:使用标签缩进文件

另外,名称中带有空格的文件无法正常工作。

最新更新