여러 파일을 병렬로 읽는 쉘 스크립트

여러 파일을 병렬로 읽는 쉘 스크립트

병렬로 실행되고 여러 파일에서 문자열을 찾는 스크립트를 작성해야 합니다.
다양한 옵션을 시도했지만 프로세서 속도가 느려졌습니다.

답변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이 순차적으로 더 빠르게 실행된다는 점에 유의하세요. 이는 맞습니다.

관련 정보