我有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小时?
答案 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."