다음 형식의 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 개의 자식 프로세스를 만들면에서 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
합니다.