가능한 가장 빠른 시간 내에 사용 가능한 모든 리소스를 사용하여 유사한 명령을 많이 실행해야 합니다.
예를 들어 내 경우는 다음 명령을 사용할 때 이미지를 처리하는 중입니다.
for INPUT in *.jpg do; some_command; done
명령은 사용 가능한 모든 리소스를 사용하지 않고 하나씩 실행됩니다.
그러나 실행을 실행하면 for INPUT in *.jpg do; some_command &; done
매우 짧은 시간 내에 시스템의 리소스가 부족해집니다.
at
님의 명령 에 대해 알고 있지만 batch
제 경우에는 사용할 수 있을지 모르겠습니다. 내가 틀렸다면 정정하십시오.
그래서 명령을 일종의 대기열에 넣고 그 중 일부만 한 번에 실행하는 방법을 생각하고 있었습니다. 그걸 어떻게 빨리 해야할지 모르겠는데 그게 문제예요. 나는 누군가가 전에 비슷한 문제를 겪었을 것이라고 확신합니다.
조언해주세요.
답변1
GNU Parallel은 바로 이것을 위해 만들어졌습니다:
parallel some_command {} ::: *.jpg
기본값은 CPU 코어당 하나의 작업입니다. 귀하의 경우 코어 수보다 하나 더 많은 작업을 실행하고 싶을 수도 있습니다.
parallel -j+1 some_command {} ::: *.jpg
GNU Parallel은 일반적인 병렬 처리기이며 동일한 시스템 또는 SSH 액세스 권한이 있는 여러 시스템에서 작업을 병렬로 쉽게 실행할 수 있도록 해줍니다.
4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.
대신 GNU Parallel은 프로세스가 완료되면 새 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.
설치
보안상의 이유로 패키지 관리자를 사용하여 GNU Parallel을 설치해야 하지만 GNU Parallel이 배포용으로 패키지되어 있지 않은 경우 루트 액세스가 필요하지 않은 개인 설치를 수행할 수 있습니다. 다음과 같이 하면 10초 안에 완료할 수 있습니다.
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README
더 알아보기
더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html
소개 동영상 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html
지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel
답변2
병렬로 작업을 실행하는 옵션 과 함께 GNU make를 사용할 수 있지만 --jobs
지정된 작업 수로 제한됩니다. 컴퓨터를 죽이지 않는 숫자로 해당 숫자를 조정할 수 있습니다.
다음은 대상 ah(예: 출력 파일일 수 있음)를 사용하고 각 대상에 대해 (더미) 명령 세트를 실행하는 Makefile의 예입니다.
all: a b c d e f g h
a b c d e f g h:
echo $@; sleep 10
NB 명령 들여쓰기~ 해야 하다TAB 문자여야 합니다. 참조GNU make 문서Makefile의 구문에 대한 자세한 내용은
make를 호출하여 make --jobs 4
다음 출력을 얻을 수 있습니다( time make --jobs 4
경과 시간을 표시하기 위해 아래에서 사용했습니다).
echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h
real 0m20.009s
user 0m0.010s
sys 0m0.011s
처음 4개는 병렬로 실행되었고 다음 4개는 병렬로 실행되었으므로 총 경과 시간은 20초입니다.