병렬 처리로 더 나은 유닉스 찾기?


43

유닉스 find(1)유틸리티는 특정 사양과 일치하는 많은 파일에 대해 작업을 수행 할 수있는 매우 유용합니다.

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

위의 내용은 특정 디렉토리의 모든 XML 파일에 대해 스크립트 나 도구를 실행할 수 있습니다.

스크립트 / 프로그램에 많은 CPU 시간이 걸리고 8 개의 프로세서가 있다고 가정 해 봅시다. 한 번에 최대 8 개의 파일을 처리하는 것이 좋습니다.

GNU make는 -j플래그를 사용하여 병렬 작업 처리를 허용 하지만 find그러한 기능은 가지고 있지 않습니다. 이것에 접근하는 다른 일반적인 작업 스케줄링 방법이 있습니까?

답변:


65

xargs-P옵션 (프로세스의 수). 4-CPU 시스템의 디렉토리에있는 모든 로그 파일을 압축하고 싶다고 가정 해보십시오.

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

-n <number>프로세스 당 최대 작업 단위 수를 말할 수도 있습니다 . 2500 파일을 가지고 있다고 말했습니다.

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

이렇게하면 4 개의 bzip2프로세스 가 시작 되고 각 프로세스는 500 개의 파일로 시작되고 첫 번째 프로세스가 완료되면 마지막 500 개의 파일에 대해 시작됩니다.

왜 이전 답변이 xargs 및을 사용하는지 make잘 모르는 경우 두 개의 병렬 엔진이 있습니다!


7
find / xargs를 사용하면주의해야합니다. find는 기본적으로 개행 문자를 출력 구분 기호로 사용하지만 xargs는 기본적으로 공백을 입력 구분 기호로 사용합니다. 안전을 위해 둘 다 -0을 사용하거나 GNU 병렬로 전환하여 기본적으로 줄 바꿈을 입력 구분 기호 (찾기 출력과 일치)로 바꿉니다.
ephemient

1
와, 대박! 방금 확인했는데 사실 xargs에는 -P옵션이 있습니다!
PP.

사용에주의하십시오 -2 개의 스레드가 동일한 정확한 순간에 출력을 생성 할 때마다 xargs -P(와 달리 parallel) 출력을 깨뜨리는 버그가 수정되지 않았습니다 .
Vlad

34

GNU 병렬 도 도움이 될 수 있습니다.

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

-j8인수 가 없으면 parallel기본값은 컴퓨터의 코어 수입니다. :-)


6

"수정"을 필요 find-의 메이크업의 사용 make자체가 병렬 처리가 없습니다.

프로세스가 로그 파일 또는 다른 출력 파일을 작성한 후 다음과 같이 Makefile을 사용하십시오.

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

따라서 다음과 같이 호출됩니다.

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

더 나은 방법은 Java 프로세스를 성공적으로 완료 한 후에 만 ​​출력 파일이 작성 make되도록하는 경우 다음에 처리되지 않은 파일 만 처리하도록 종속성 처리를 활용할 수 있습니다 .


1
이 파일 이름에 공백이나 다른 "관심있는"문자가 없기를 바랍니다. Make는 그것들을 매우 우아하게 처리하지 않습니다.
ephemient

훌륭한 아이디어! 이와 같은 메이크 파일 사용을 생각하지 마십시오.
oscfri

3

찾기에는 "+"기호를 사용하여 직접 사용할 수있는 병렬 옵션이 있습니다. xargs가 필요하지 않습니다. grep과 결합하면 트리를 빠르게 추출하여 일치하는 항목을 찾을 수 있습니다. 예를 들어 문자열 'foo'를 포함하는 소스 디렉토리의 모든 파일을 찾고 있다면 호출 할 수 있습니다
find sources -type f -exec grep -H foo {} +


12
찾기 매뉴얼을 읽으면 -exec command +구문이 병렬로 실행되지 않지만 많은 파일을 함께 "그룹화"하고 동시에 여러 파일을 인수로 사용하여 명령을 실행한다는 것을 알 수 있습니다. grep이 대상을 병렬로 볼 수 있습니다.
Gyscos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.