2014-11-10 3 views
0

각 파일 당 2 개의 작업을 수행하고 싶은 20 개의 파일이 있으며 각각 30 분이 걸립니다. 필자는 파일의 이름 목록을 포함하는 파일을 가져 와서 for 루프의 각 파일에 대해 반복하는 스크립트를 작성했습니다. 두 개의 루프를 작성하면 하나는 데이터의 전반부에서 작동하고 다른 하나는 데이터의 두 번째 절반에서 작동하고 완료된 후에는 "&"을 사용하여 시간이 반으로 줄어든 것을 발견했습니다. 이것은 병렬 처리로 간주됩니까?bash 스크립팅에서 병렬로 2 개의 루프 실행

코드는 다음과 같습니다

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

을 약 5 시간 10시간에서 감소이 시간까지! 파일을 나눌 청크의 수를 판별하고 각 청크마다 루프를 위해 별도로 실행하는 방법이 있습니까? 예를 들어 매개 변수로 스크립트에 4를 부여하면 파일을 4 개의 챈크 (각각 5 개)로 나누고 백그라운드에서 병렬로 각 분기마다 4 개의 루프를 실행합니다. 그래서 시간이 2.5 시간이됩니까?

+0

'나는 대한의 파일이 (당신이 확장 경로 이름의 대상이 될 것이다) 와일드 카드가있는 경우 $이 (고양이 $ 1)'위험한 같습니다 여기

는 n 개의 덩어리에 대한 예입니다. 파일의 각 _line_을'sample' 배열에 넣으려면'mapfile -t sample < "$ 1"을 대신 사용하십시오 (훨씬 효율적입니다). –

답변

2

예 병렬 처리입니다.

#! /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." 
관련 문제