수색…
소개
GNU Linux의 작업은 GNU 병렬을 사용하여 병렬 처리 할 수 있습니다. 작업은 입력의 각 행에 대해 실행해야하는 단일 명령 또는 작은 스크립트 일 수 있습니다. 일반적인 입력은 파일 목록, 호스트 목록, 사용자 목록, URL 목록 또는 표 목록입니다. 작업은 파이프에서 읽는 명령 일 수도 있습니다.
통사론
- 병렬 [옵션] [명령 [인수]] <목록 _ 값>
매개 변수
선택권 | 기술 |
---|---|
-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로 압축되어 있고 다음과 같은 작업 순서가 필요합니다.
-
bzcat
을 사용하여 stdout에 bz2 파일 압축 해제 - 그렙 (예 : 필터) 특정 키워드 (들)을 사용하여 라인
grep <some key word>
-
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
로 전달 된 원래 행 번호를 나타냅니다. 두 번째 열 (및 파일의 나머지 부분)의 순서가 유지된다는 것을 알아야합니다.