병렬로 실행되고 여러 파일에서 문자열을 찾는 스크립트를 작성해야 합니다.
다양한 옵션을 시도했지만 프로세서 속도가 느려졌습니다.
답변1
파일이 다른 디스크에 있는 경우 grep
각 디스크에서 명령을 실행합니다.
동일한 디스크에 있는 파일의 경우 병목 현상은 디스크에서 읽는 중입니다. 여러 파일을 병렬로 읽으면 속도가 더 나빠질 뿐입니다.
파일이 RAID-0 배열에 있는 경우 grep
두 명령을 동시에 실행하여 속도를 높일 수 있습니다. 실제로 시간을 얻고 있는지 확인하려면 벤치마크 테스트를 수행하십시오. 낮은 기술 접근 방식:
grep file1 file2 file3 &
grep file4 file5 file6
그리고GNU 병렬:
parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6
다음에서 파일을 얻는 경우 find
:
find … -print0 | parallel -0 -j 2
grep
기억하세요: 파일이 동일한 디스크에 있으면 단일 명령이 가장 빠릅니다.
답변2
나는 귀하의 파일이 매우 크다고 추측합니다. 그렇지 않으면 아마도 작업 병렬화에 신경 쓰지 않을 것입니다.
GNU parallel
의 제안은 좋습니다(GNU에는 병렬 실행 옵션 xargs
도 있습니다 )-P
하지만하나 이상의 파일을 greping하는 것이 CPU 집약적인 작업이 아니라 I/O 집약적인 작업이라는 점을 고려하면 이제 디스크 액세스를 위해 경쟁하는 여러 프로세스가 있기 때문에 여러 grep을 병렬로 실행하면 실제로 속도가 느려지는 것을 알 수 있습니다.
여기서 제한 요소는 CPU 성능이 아니라 I/O 속도입니다. 단일 grep 프로세스라도 대부분의 시간을 디스크의 데이터를 기다리는 데 소비할 수 있습니다(즉, CPU는 대부분의 시간 동안 유휴 상태입니다).
디스크의 파일이 물리적으로 서로 가깝지 않으면많은디스크 헤드가 더 많이 움직여야 하기 때문에 속도가 느려집니다(물론 SSD나 램디스크에서는 문제가 되지 않거나 파일이 이미 캐시된 경우에는 문제가 되지 않습니다).
답변3
GNU 병렬성을 시도해 볼 수 있습니다.
find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}
( 에서http://www.gnu.org/software/parallel/man.html#example__parallel_grep)
편집: 다른 설명에서는 병목 현상이 IO인 경우 grep이 순차적으로 더 빠르게 실행된다는 점에 유의하세요. 이는 맞습니다.