bash 스크립트에서 멀티 스레딩 / 포킹


9

다음 형식의 bash 스크립트를 작성했습니다.

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

while루프에서 읽을 $inFile라인에 어떤 활동을 수행하고있는 결과를 덤프 $outFile.

(가)으로 $inFile3500 선 길이, 스크립트는 완전히 실행 6-7 시간이 걸릴 것입니다. 이 시간을 최소화하기 위해이 스크립트에서 멀티 스레딩 또는 포크를 사용할 계획입니다. 8 개의 자식 프로세스를 만들면에서 8 줄이 $inFile동시에 처리됩니다.

이것을 어떻게 할 수 있습니까?


주의 : 다른 스크립트는 다른 아웃 파일 에 기록해야합니다 . 또한 작성된 스크립트는 첫 번째 조치로 입력 파일을 삭제합니다!
pjc50

답변:


10

GNUparallel 는 이런 종류의 것을 위해 만들어졌습니다. 각 입력에 대해 입력 된 데이터와 다른 데이터를 사용하여 한 번에 여러 번 스크립트를 실행할 수 있습니다.

cat input.txt | parallel --pipe your-script.sh

기본적으로 시스템의 프로세서 수에 따라 프로세스를 생성하지만을 사용하여 프로세스를 사용자 정의 할 수 있습니다 -j N.

특히 깔끔한 트릭은 shebang-wrapping 기능입니다. Bash 스크립트의 첫 줄을 다음과 같이 변경하면 :

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

표준 입력으로 데이터를 공급하면 모두 자동으로 발생합니다. 마지막에 정리 코드를 실행해야 할 때 유용하지 않습니다.

주목해야 할 것이 몇 가지 있습니다. 하나는 입력을 순차적 청크로 자르고 한 번에 하나씩 사용한다는 것입니다. 라인을 인터리브하지 않습니다. 다른 하나는 그 청크가 얼마나 많은 레코드가 있는지에 관계없이 크기별로 분할된다는 것입니다. --block N다른 블록 크기를 바이트 단위로 설정하는 데 사용할 수 있습니다 . 귀하의 경우, 파일 크기의 8 분의 1이 적당합니다. 파일이 작 으면 하나의 블록으로 모두 끝날 수있을 정도로 작게 들릴 수 있습니다.

특정 사용 사례에 대한 많은 옵션이 있지만 튜토리얼 에서는 내용을 잘 다룹니다. 관심있는 옵션은 --round-robin및 을 포함 --group합니다.


1
그 세방 라인을 테스트 했습니까? 여러 가지 주장을 가진 Shebang은 이동할 수 없습니다. Linux에서는 #!a b c결과가 ["b c"]나오고 다른 시스템에서는 결과가 나타납니다 ["b", "c"].
nyuszika7h

1
이 방법으로 사용될 때 자체 인수를 다시 분석합니다 (그렇지 않으면 옵션이 많이 사용되지 않음).
Michael Homer

@MichaelHomer GNU parallelHTML 페이지 스크랩에 사용해야 합니다. 이 스레드를 살펴보세요. unix.stackexchange.com/questions/277609/…
Swatesh Pakhare
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.