수색…


소개

GNU Linux의 작업은 GNU 병렬을 사용하여 병렬 처리 할 수 ​​있습니다. 작업은 입력의 각 행에 대해 실행해야하는 단일 명령 또는 작은 스크립트 일 수 있습니다. 일반적인 입력은 파일 목록, 호스트 목록, 사용자 목록, URL 목록 또는 표 목록입니다. 작업은 파이프에서 읽는 명령 일 수도 있습니다.

통사론

  1. 병렬 [옵션] [명령 [인수]] <목록 _ 값>

매개 변수

선택권 기술
-jn 병렬로 n 개 작업 실행
-k 동일한 주문 유지
-X 컨텍스트 대체를 사용한 여러 인수
--colsep regexp 위치 교체를 위해 regexp에서 입력 분할
{} {.} {/} {/.} {#} 교체 문자열
{3} {3.} {3/} {3/.} 위치 대체 문자열
-S sshlogin Example: [email protected]
--trc {}.bar --transfer --return {} .bar --cleanup에 대한 속기
--onall 모든 sshlogins에서 인수와 함께 주어진 명령을 실행하십시오.
--nonall 모든 sshlogins에 인수없이 주어진 명령을 실행하십시오.
--pipe stdin (표준 입력)을 여러 작업으로 분할하십시오.
--recend str --pipe에 대한 끝 분리 기호를 기록하십시오.
--recstart str --pipe에 대한 기록 시작 구분 기호.

파일 목록에서 반복되는 작업 병렬화

컴퓨터 자원 (예 : CPU 및 RAM)을 더 많이 사용하면 반복적 인 작업을 더 효율적으로 수행 할 수 있습니다. 다음은 여러 작업을 병렬로 실행하는 예입니다.

당신이 있다고 가정 < list of files > , 출력 말할 ls . 또한,이 파일들이 bz2로 압축되어 있고 다음과 같은 작업 순서가 필요합니다.

  1. bzcat 을 사용하여 stdout에 bz2 파일 압축 해제
  2. 그렙 (예 : 필터) 특정 키워드 (들)을 사용하여 라인 grep <some key word>
  3. gzip 사용하여 연결될 출력을 하나의 gzipped 단일 파일로 파이프하십시오.

while 루프를 사용하여 이것을 실행하면 다음과 같이 보일 수 있습니다.

filenames="file_list.txt"
while read -r line
do
name="$line"
     ## grab lines with puppies in them
     bzcat $line | grep puppies | gzip >> output.gz
done < "$filenames"

GNU Parallel을 사용하여 우리는 한 번에 3 개의 병렬 작업을 수행 할 수 있습니다.

parallel -j 3 "bzcat {} | grep puppies" ::: $( cat filelist.txt ) | gzip > output.gz

이 명령은 파일 수와 파일 크기가 클 때 간단하고 간결하며 더 효율적입니다. 작업은 parallel 시작되고, 옵션 -j 3 은 3 개의 병렬 작업을 시작하고 병렬 작업에 대한 입력은 ::: 에 의해 수행됩니다. 출력은 결국 gzip > output.gz 로 파이프됩니다.

STDIN을 병렬 처리하십시오.

이제 우리는 한 줄씩 변환해야하는 1 개의 큰 파일 (예 : 30GB)이 있다고 가정 해 봅시다. 이 <task> 를 수행하는 스크립트 인 convert.sh 가 있다고 가정 convert.sh . 우리는이 파일의 파이프 내용에 걸릴 병렬 위해 표준 입력 (stdin)과 같은 덩어리에서 작업 할 수 있습니다

<stdin> | parallel --pipe --block <block size> -k <task> > output.txt

여기서 <stdin>cat <file> 과 같은 것에서 유래 할 수 있습니다.

재현 가능한 예로서 우리의 과제는 nl -n rz 가 될 것입니다. 어떤 파일이라도 가져 data.bz2 가되고 <stdin>

bzcat data.bz2 | nl | parallel --pipe --block 10M -k nl -n rz | gzip > ouptput.gz

위의 예제는 bzcat data.bz2 | nl 에서 <stdin> 을 취합니다. bzcat data.bz2 | nl , 여기서 nl 은 개념의 증거로서 최종 출력 output.gz 가 수신 된 순서대로 저장된다는 것을 증명했습니다. 그런 다음 <stdin> 을 크기가 10MB 인 덩어리로 parallel 분할하고 각 덩어리에 대해 nl -n rz 통해 전달합니다. 여기서는 숫자를 올바르게 추가합니다 (자세한 내용은 nl --help 참조). --pipe 옵션은 parallel 로 여러 작업으로 <stdin> 을 나눕니다. --pipe-- block 의 크기를 지정합니다. -k 옵션은 순서를 유지해야한다고 지정합니다.

최종 결과물은 다음과 같아야합니다.

000001       1  <data>
000002       2  <data>
000003       3  <data>
000004       4  <data>
000005       5  <data>
 ... 
000587  552409  <data>
000588  552410  <data>
000589  552411  <data>
000590  552412  <data>
000591  552413  <data>

내 원본 파일은 552,413 줄이었습니다. 첫 번째 열은 병렬 작업을 나타내고 두 번째 열은 청크로 parallel 로 전달 된 원래 행 번호를 나타냅니다. 두 번째 열 (및 파일의 나머지 부분)의 순서가 유지된다는 것을 알아야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow