GNU 병렬 - 배열의 두 매개변수를 인수로 사용

GNU 병렬 - 배열의 두 매개변수를 인수로 사용

Gnu 병렬성을 사용하는 스크립트가 있습니다. 각 "반복"에 대해 두 개의 매개변수를 전달하고 싶습니다.

직렬 실행에는 다음과 같은 것이 있습니다.

for (( i=0; i<=10; i++ ))
do
  a = tmp1[$i]
  b = tmp2[$i]
done

나는 그것을 병렬화하고 싶다.

func pf()
{
   a=$1
   b=$2
}
export -f pf
parallel --jobs 5 --linebuffer pf ::: <what to write here?>

답변1

집중을 유지하기 위해 다른 parallel플래그를 생략하는 중...

parallel --link pf ::: A B ::: C D

먼저 다음을 a=A사용하여 함수를 b=C실행합니다 .a=Bb=D

a=A b=C
a=B b=D

그렇지 않으면 --link다음과 같은 완전한 조합을 얻을 수 있습니다.

a=A b=C
a=A b=D
a=B b=C
a=B b=D

고쳐 쓰다:Ole Tange가 댓글에서 언급했듯이 [삭제됨 -에드.] 이를 수행하는 또 다른 방법이 있습니다: :::+연산자를 사용하는 것입니다. 그러나 이 두 가지 옵션에는 중요한 차이점이 있습니다.만약에매개변수 위치마다 매개변수 개수가 동일하지 않습니다. 설명하기 위해 예를 들어보세요.

parallel --link pf ::: A B ::: C D E산출:

a=A b=C
a=B b=D
a=A b=E

parallel pf ::: A B :::+ C D E산출:

a=A b=C
a=B b=D

따라서 --link모든 매개변수가 소비되도록 "래핑"되고 :::+추가 매개변수는 무시됩니다. (일반적인 경우 --link대안은 입력을 자동으로 무시하는 것이기 때문에 나는 그것을 선호합니다. YMMV.)

답변2

단순화하기 위해 bash를 가정하고 배열의 인덱스는 0이 아닌 1부터 지정됩니다. 다음과 같은 작업을 수행하는 것이 직관적인 것 같습니다.

parallel ... pf '$tmp1[{#}]' '$tmp2[{#}]' ::: $(seq 10)

함수의 두 매개변수가 pf명령의 일부인 경우 병렬 표기법을 사용하여 작업 번호를 나타냅니다(10개 작업의 경우 1에서 10까지 설정). 나중에 10개 작업을 실행하려면 10개 매개변수 {#}만 가져오면 됩니다 ( seq 값은 사용되지 않으며 작업 번호와 동일하게 발생합니다.)seq:::

불행히도 bash는 배열 변수를 내보내지 않기 때문에 작동하지 않습니다. 그러나 함수를 내보낼 수 있으며 매뉴얼 페이지에는 parallel선택한 함수를 내보내거나 가져오는 간단한 함수를 사용하여 선택한 배열 변수를 설정하는 해결 방법이 나와 있습니다.import_arraymy_importer

declare -a tmp1 tmp2
for (( i=1; i<=10; i++ ))
do tmp1[$i]=x$i
   tmp2[$i]=y$i
done

import_array(){
    local func=$1; shift;
    export $func='() {
      '"$(for arr in $@; do
            declare -p $arr|sed '1s/declare -./&g/'
          done)"'
    }'
}
import_array my_importer tmp1 tmp2

옵션을 사용하여 명령 환경에 함수를 전달한 parallel다음 실행하기 전에 함수를 실행하면 됩니다 .my_importerpf--env my_importerpf

pf(){ a=$1; b=$2; echo "job a=$a b=$b"; }
export -f pf 

parallel -v --jobs 5 --linebuffer \
 --env my_importer 'my_importer;'  pf '${tmp1[{#}]}' '${tmp2[{#}]}' ::: $(seq 10)

결과 출력은 -v다음과 비슷합니다.

my_importer; pf ${tmp1[2]} ${tmp2[2]}
my_importer; pf ${tmp1[1]} ${tmp2[1]}
my_importer; pf ${tmp1[5]} ${tmp2[5]}
my_importer; pf ${tmp1[3]} ${tmp2[3]}
job a=x1 b=y1
my_importer; pf ${tmp1[6]} ${tmp2[6]}
job a=x2 b=y2
my_importer; pf ${tmp1[7]} ${tmp2[7]}
job a=x4 b=y4
...

관련 정보