find를 사용하여 재귀 삭제 병렬화

find를 사용하여 재귀 삭제 병렬화

모든 것을 재귀적으로 삭제하고 싶습니다 .in. 시간이 오래 걸리고 사용 가능한 코어가 많기 때문에 이 프로세스를 병렬화하고 싶습니다. ~에서이 스레드xargs, 사용 되거나 make병렬화 될 수 있는 것 같습니다 find. 이 find 애플리케이션을 병렬화할 수 있습니까?

이것은 내 현재 직렬 명령입니다.

find . -name "*.in" -type f -delete

답변1

이것을 (기본값) -delete로 바꾸고 GNU 병렬로 파이핑하면 트릭을 수행할 수 있습니다.-print

find . -name '*.in' -type f | parallel rm --

그러면 코어당 하나의 작업이 실행됩니다. 대신 병렬 작업을 사용합니다 -j N.N

삭제는 아마도 CPU 제한보다 I/O가 더 많기 때문에 이것이 순차 삭제보다 빠르게 실행될지는 확실하지 않지만 테스트해 보는 것은 흥미로울 것입니다.

(두 명령이 정확하게 동일하지 않기 때문에 "대부분"이라고 말합니다. 예를 들어, parallel입력 경로 중 일부에 개행 문자가 포함된 경우 이 버전은 올바른 작업을 수행하지 않습니다.)

답변2

(또는 더 정확한 표현은 + (또는 )) find . -name "*.in" -type f -delete로 바꾸는 것이 항상 좋은 선택은 아닐 수도 있습니다.find . -name '*.in' -type f | parallel rm --find -print0parallel -0xargs -r0 -P10 -n1

$ parallel -X touch {}.testfile ::: {00000..99999}
$ ls | wc -l
100000
$ time find . -name '*.testfile' -type f | parallel -j10 rm --

real    20m58.470s
user    11m30.553s
sys     58m15.265s
$ parallel -X touch {}.testfile ::: {00000..99999}
$ ls | wc -l
100000
$ time find . -name '*.testfile' -type f -delete

real    3m57.199s
user    0m0.973s
sys     0m37.356s

여기서 볼 수 있듯이순차 버전이 훨씬 빠릅니다.. 다른 사람들이 올바르게 지적했듯이I/O 경계는 다음과 같습니다.이것한계요인(매우 낮은 CPU, 디스크 및 메모리 사용률), 병렬화는 약간의 오버헤드만 추가합니다(간단한 경우).


병렬화 옵션을 조정하면 비슷하거나 더 나은 결과를 얻을 수 있습니다. 시작하는 한 가지 방법은 옵션을 설명하는 것입니다.여기.

find이것은 약간 속였습니다( 여기에 문서가 없지만 이름을 알고 있다고 가정합니다).하지만 여전히 느리다순서대로:

$ time seq -f 'rm %04g.testfile' 00000 99999 | parallel --pipe sh

real    8m9.800s
user    2m54.668s
sys     0m57.027s

관련 정보