【问题标题】:How to convert for loop to multiple job submission?如何将for循环转换为多个作业提交?
【发布时间】:2019-05-15 16:13:27
【问题描述】:

我使用 qsub SubmitJob.sh 将作业提交到集群。它运作良好,但需要很长时间才能完成。在 SubmitJob.sh 内部有一个按顺序运行的 for 循环。我想将我的 for 循环转换为并行作业提交,这样他们每个人都提交一个作业(SubmitJob.sh)。

#!/bin/bash
#$ -S /bin/bash
#$ -V -cwd
#$ -e ./error.$JOB_NAME.$JOB_ID
#$ -o ./outpt.$JOB_NAME.$JOB_ID
#$ -l h_vmem=256g
##$ -q long
##$ -pe smp 4
#$ -l h_rt=24:00:00


cd /mydirectroy/

for ID in $(cat FilID.txt) ; do

Do_Somthing -n $ID  -o /OutputDirectory/$ID

done

【问题讨论】:

  • 高级思想,将FiLID.txt的内容分成4部分,将for loop放入一个函数,该函数将使用&在后台运行这些东西。将文件的 4 个部分输入同一个函数 4 次。最后输入wait 以确保一切都已完成。这将是异步的。

标签: bash parallel-processing


【解决方案1】:

我不得不做一两次这样的事情。一般的想法是您提供数组的一部分作为对函数的引用并将其作为子进程执行。我选择使用平方根作为分隔符,因为工作量会随着要处理的项目数量线性增长。

#! /bin/bash

FILE="FilID.txt"
DATA=($(cat ${FILE}))
AMOUNT=${#DATA[@]}
RANGE=$(echo "sqrt(${AMOUNT})" | bc)

echo ${amount}
echo $range

function _child {
        local -n numbers=$1
        echo "From ${numbers[0]} to ${numbers[-1]}"
        for n in ${numbers[@]}; do echo -n "$n, "; done
        echo 
}

for ((i=0; i<AMOUNT; i+=RANGE)) {
        part=(${DATA[@]:$i:$RANGE})
        _child part &
        # wait
}

wait
exit 0

您可以通过填充 FilID.txt 来测试脚本,如下所示。取消注释 for 循环中的 wait 以获得可读输出。

$ seq 0 98 > FilID.txt

您可能希望等到每 N 个子进程都完成后再开始下一批。回到我执行脚本时,负载变得太高,Linux 选择杀死我们的虚拟开发环境:p

附:如果 FilID.txt 包含带有文件名的空格,则必须设置 IFS=$'\n' 或其他内容。

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多