Bash 스크립트의 멀티스레딩/포킹

Bash 스크립트의 멀티스레딩/포킹

다음 형식으로 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.

$inFile스크립트에는 3500줄이 넘으므로 전체 실행에는 6~7시간이 소요됩니다 . 이 시간을 최소화하기 위해 이 스크립트에서는 멀티스레딩이나 포크를 사용할 계획입니다. 8개의 하위 프로세스를 생성하면 $inFile8개의 행이 동시에 처리됩니다.

이것이 어떻게 달성될 수 있습니까?

답변1

암소 비슷한 일종의 영양parallel이런 종류의 일을 위해 설계되었습니다. 한 번에 여러 번 스크립트를 실행하고 각 스크립트에 입력과 다른 데이터를 제공할 수 있습니다.

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

기본적으로 시스템의 프로세서 수에 따라 프로세스를 생성하지만 -j N.

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

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

표준 입력을 통해 데이터를 공급하면 모든 일이 자동으로 발생합니다. 이는 마지막에 실행해야 하는 정리 코드가 있는 경우(실행할 수 있음) 덜 유용합니다.

몇 가지 주의할 점이 있습니다. 하나는 입력을 인접한 청크로 분할하고 한 번에 하나씩 청크를 사용한다는 것입니다. 줄을 인터리브하지 않습니다. 또 다른 방법은 레코드 수에 관계없이 청크가 크기별로 분할된다는 것입니다. 이를 사용하여 --block N다양한 블록 크기(바이트)를 설정할 수 있습니다 . 귀하의 경우 파일 크기의 1/8 이하가 정확해야 합니다. 파일이 하나의 덩어리로 끝날 정도로 작을 수도 있고, 그렇지 않으면 목적을 상실할 수도 있습니다.

특정 사용 사례에 대한 다양한 옵션이 있지만지도 시간내용이 아주 잘 담겨있습니다. 관심을 가질 만한 옵션에는 --round-robin및 이 포함됩니다 --group.

관련 정보