모든 것을 재귀적으로 삭제하고 싶습니다 .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 -print0
parallel -0
xargs -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