
다음 형식으로 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개의 하위 프로세스를 생성하면 $inFile
8개의 행이 동시에 처리됩니다.
이것이 어떻게 달성될 수 있습니까?
답변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
.