【问题标题】:Use GNU parallel to parallelise a bash for loop使用 GNU 并行并行化 bash for 循环
【发布时间】:2017-06-05 11:01:31
【问题描述】:

我有一个 for 循环,它在 100 个不同的输入文件夹上运行 Python 脚本约 100 次。 python 脚本在 2 个内核上效率最高,我有 50 个内核可用。所以我想一次使用 GNU 并行在 25 个文件夹上运行脚本。

这是我的 for 循环(工作正常,但当然是连续的),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 个文件夹作为 {} 传递给脚本.

感谢所有提示。

【问题讨论】:

    标签: python unix gnu-parallel


    【解决方案1】:

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

    如果没有双引号,shell 会解析$folders 中的空格并将它们作为单独的参数传递给echo,这会使它们打印在一行上。 parallel 提供每一行作为作业的参数。

    为了完全避免此类引用问题,将find 直接通过管道传递给parallel 总是一个好主意,并使用空字符作为分隔符:

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

    即使遇到包含多个空格或换行符的文件名,这也会起作用。

    【讨论】:

    • 啊!两个简单的解决方案。我不会想到第一个,但应该尝试第二个。谢谢。
    【解决方案2】:

    你可以通过管道直接找到并行:

     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
    

    【讨论】:

      【解决方案3】:

      您可以像这样创建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

      小心:使用制表符在文件中缩进

      此外,名称中带有空格的文件也无法使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多