GNU Parallel - m개의 정규식을 찾기 위해 n줄을 grep합니다.

GNU Parallel - m개의 정규식을 찾기 위해 n줄을 grep합니다.

GNU 병렬m개의 정규식을 찾기 위해 n줄을 grep하세요예시 지침은 다음과 같습니다.

CPU가 제한 요소인 경우 정규식을 병렬화해야 합니다.

cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile

이렇게 하면 CPU당 하나의 grep이 실행되고 CPU당 한 번씩 큰 파일을 읽게 됩니다. 그러나 이 작업은 병렬로 수행되므로 첫 번째 읽기를 제외한 모든 읽기가 RAM에 캐시됩니다.

따라서 이 예에서 GNU는 parallelgrep의 병렬 인스턴스에서 정규식을 반올림하여 각각 개별적으로 읽습니다. 위의 문서에 나와 있듯이 디스크 캐싱을 사용하면 디스크에서 한 번만 읽을 수 있습니다.regex.txtgrepbigfilebigfile

parallel내 질문은 이것입니다. 위의 접근 방식은 읽기의 각 병렬 인스턴스에서 GNU 루프 레코드를 가져오는 것과 관련된 다른 접근 방식보다 성능 측면에서 더 나은 것으로 간주되는 것 같습니다 .bigfilegrepregexp.txt

cat bigfile |  parallel --pipe -L1000 --round-robin grep -f regexp.txt -

왜 그럴까요? 내가 볼 수 있듯이 디스크 캐시가 실행 bigfile중이고 regexp.txt두 경우 모두 디스크에서 한 번 읽힌다고 가정합니다 . 제가 생각할 수 있는 주요 차이점 중 하나는 두 번째 접근 방식이 파이프를 통해 더 많은 데이터를 전달한다는 것입니다.

답변1

이는 GNU Parallel --pipe의 느린 속도 때문입니다.

cat bigfile |  parallel --pipe -L1000 --round-robin grep -f regexp.txt -

최대 속도는 약 100MB/s입니다.

매뉴얼 페이지 예에서는 다음도 찾을 수 있습니다.

parallel --pipepart --block 100M -a bigfile grep -f regexp.txt

성능은 거의 동일하지만 64코어 시스템에서 최대 20GB/s에 도달할 수 있습니다.

parallel --pipepart --block 100M -a bigfile -k grep -f regexp.txt

정확히 같은 결과를 주어야합니다grep -f regexp.txt bigfile

관련 정보