bash 스크립트에서 멀티 스레딩 / 포킹 in $runtime seconds.” while루프에서 읽을 $inFile라인에 어떤

다음 형식의 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동시에 처리됩니다.

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



답변

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합니다.