如何将for loop转换为多个作业提交?

时间:2019-05-15 16:13:28

标签: bash parallel-processing

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

        var entry = new EntityEnviroment
        {
            env_name = result.environment_status.env_name,
            env_country = "Ger",
            failedReportDetails = new List<EntityFailedReportDetail>()
        };

        foreach (var value in result.failed_report_details)
        {
            var entryDetail = new EntityFailedReportDetail();
            entryDetail.report_id = value.report_id;
            entryDetail.report_status = value.report_status;

            entry.failedReportDetails.Add(entryDetail);

        }

1 个答案:

答案 0 :(得分:0)

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

#! /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

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