我有一个用于循环的循环,该循环在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
请小心:使用标签缩进文件
另外,名称中带有空格的文件无法正常工作。