xargs를 통해 여러 Perl 인스턴스 실행

xargs를 통해 여러 Perl 인스턴스 실행

dataProcessing.pl탭으로 구분된 .txt파일을 허용하고 포함된 데이터에 대해 많은 처리를 수행하는 스크립트가 있습니다 . file1.txt file2.txt file3.txt현재 bash 스크립트의 일부로 반복되어 각 반복 중에 perl을 호출하는 여러 입력 파일( )이 있습니다 (즉, 한 번에 하나의 입력 파일을 처리함).

그러나 가능한 경우 Perl의 여러 인스턴스를 실행하고 xargs를 통해 모든 입력 파일을 동시에 처리하고 싶습니다. 나는 당신이 다음과 같은 것을 실행할 수 있다는 것을 알고 있습니다.

perl -e 'print "Test" x 100' | xargs -P 100

그러나 Perl의 열려 있는 각 병렬 인스턴스(file1.txt에 대한 인스턴스 하나, file2.txt에 대한 인스턴스 등)에 서로 다른 파일을 전달하고 싶습니다. 파일 핸들이나 파일 경로는 Perl에 인수로 전달될 수 있습니다. 어떻게 해야 하나요? 예를 들어, 파일 이름을 xargs에 전달하는 방법을 잘 모르겠습니다.

답변1

사용 xargs의 의미 -n 1는 "유틸리티에 대한 각 호출에 하나의 인수만 전달"하는 것입니다.

그것은 다음과 같습니다:

printf '%s\n' file*.txt | xargs -n 1 -P 100 perl dataProcessing.pl

파일 이름에 리터럴 개행 문자가 포함되어 있지 않다고 가정합니다.

GNU 또는 그 xargs구현(널로 구분된 인수 읽기, 개행 문자가 있는 파일 이름 허용) 및 (아무 것도 일치하지 않고 유효한 경우 빈 인수 목록 없이 유틸리티를 실행하기 위해) 다음과 같이 할 수 있습니다.xargs-0-rfile*.txtnullglob

printf '%s\0' file*.txt | xargs -r0 -n 1 -P 100 perl dataProcessing.pl

두 변형 모두 최대 100개의 스크립트 병렬 인스턴스를 시작할 수 있지만 이는 원하는 결과가 아닐 수도 있습니다. 이를 컴퓨터의 CPU 수와 관련된 합리적인 숫자(또는 사용 가능한 총 RAM 양을 작업당 예상 메모리 사용량(메모리 바인딩된 경우)으로 나눈 값)으로 제한할 수 있습니다.

답변2

여기서는 화려할 필요가 없습니다. bash for 루프에서는 perl 프로세스를 백그라운드로 설정하면 됩니다.

for f in file*.txt; do
    perl dataProcessing.pl "$f" &
done
# wait for them to complete
wait
echo "All done."

답변3

GNU Parallel은 정확히 다음을 위해 설계되었습니다:

parallel some_command {} ::: *.txt

기본적으로 각 CPU 코어는 하나의 작업을 실행합니다. 100개의 작업을 병렬로 실행하려면 다음을 수행하세요.

parallel -j100 some_command {} ::: *.txt

Perl을 알고 나면 GNU Parallel의 고급 기능을 사용해도 편안함을 느낄 수 있습니다. 이것이 어떤 역할을 한다고 생각하시나요:

parallel echo '{= s/(\d+)/$1*2/e; s/(.)/uc($1)/e; s/bar/baz/; s/foo/bar/ =}' \
  ::: 'my foo' 'i went to a baraar to get a 12" crowfoo'

GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.

4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치하다

보안상의 이유로 패키지 관리자를 사용하여 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

관련 정보