在bash脚本中并行运行2个循环

时间:2014-11-10 16:17:26

标签: bash parallel-processing

我有20个文件,我想对每个文件执行2次操作,每个文件需要30分钟。我写了一个脚本,它接受一个包含文件名列表的文件,并在for循环中迭代每个文件。我发现如果我写了2个for循环,一个操作数据的前半部分,另一个操作数据的后半部分,使用“&”完成后,时间减少到一半。这被认为是并行吗?

代码如下所示:

 #!/bin/bash

    for i in $(cat $1); do sample+=($i); done
    tLen=${#sample[@]}

    #loop works on first half of the data

    for (( i=0; i<${tLen}/2; i++ ));
    do
        # operation 1 on ${sample[$i]}
        # operation 2 on ${sample[$i]} which is dependent on operation 1
    done &

   #loop works on second half of the data

    for (( i=${tLen}/2; i<${tLen}; i++ ));
    do
        # operation 1 on ${sample[$i]}
        # operation 2 on ${sample[$i]} which is dependent on operation 1
    done &

由此,时间从10小时减少到5小时左右! 有没有办法确定我想要分割文件的块数,并为每个块运行单独的for循环。例如,我给脚本4作为参数,它将文件分成4个通道(每个5个)并在后台并行运行4个独立的for循环?  所以时间变成2.5小时?

1 个答案:

答案 0 :(得分:2)

是的,这是并行性。

以下是n个块的示例:

#! /bin/bash

for i in $(< "$1"); do sample+=("$i"); done
tLen=${#sample[@]}
nChunks=4

for ((j = 0; j < nChunks; j++)) ; do
    for (( i=tLen*j/nChunks; i<tLen*(j+1)/nChunks; i++ )); do
        # operation on ${sample[$i]}
    done &
done

# Now wait for termination
wait
echo "Done."