GNU 병렬화가 너무 느립니다.

GNU 병렬화가 너무 느립니다.

grep수백만 개의 파일을 실행해야 합니다 . 그래서 나는 속도를 높이려고 노력했습니다.여기에 언급된 두 가지 방법: xargs -P -n그리고GNU parallel. 내 파일의 하위 집합(번호 9026)에 대해 이 작업을 시도했는데 결과는 다음과 같습니다.

  1. 를 사용하면 xargs -P 8 -n 1000매우 빠르게:

    $ time find tex -maxdepth 1 -name "*.json" | \
                    xargs -P 8 -n 1000 grep -ohP "'pattern'" > /dev/null
    
    real    0m0.085s
    user    0m0.333s
    sys     0m0.058s
    
  2. parallel매우 천천히 사용하십시오 .

    $ time find tex -maxdepth 1 -name "*.json" | \
                    parallel -j 8 grep -ohP "'pattern'" > /dev/null
    
    real    0m21.566s
    user    0m22.021s
    sys     0m18.505s
    
  3. 주문조차도 다음 xargs보다 낫습니다 parallel.

    $ time find tex -maxdepth 1 -name "*.json" | \
                    xargs grep -ohP 'pattern' > /dev/null
    
    real    0m0.242s
    user    0m0.209s
    sys     0m0.040s
    

xargs -P n모든 프로세스의 출력이 인터리브되기 때문에 저에게는 작동하지 않습니다. parallel따라서 이러한 큰 속도 저하를 일으키지 않고 사용하고 싶습니다 parallel.

어떤 아이디어가 있나요?

고쳐 쓰다

  1. 따르다올레 탕헤르의 답변, 시도해 보았는데 parallel -X, 완전성을 위한 결과는 다음과 같습니다.

    $ time find tex -maxdepth 1 -name "*.json" | \
        parallel -X -j 8 grep -ohP "'pattern'" > /dev/null
    
    real    0m0.563s
    user    0m0.583s
    sys     0m0.110s
    
  2. 가장 빠른 솔루션:따르다@cas의 댓글-H, grep 옵션(파일 이름 강제 인쇄) 및 정렬을 사용해 보았습니다 . 결과는 다음과 같습니다.

    time find tex -maxdepth 1 -name '*.json' -print0 | \
        xargs -0r -P 9 -n 500 grep --line-buffered -oHP 'pattern' | \
        sort -t: -k1 | cut -d: -f2- > /dev/null
    
    real    0m0.144s
    user    0m0.417s
    sys     0m0.095s
    

답변1

노력하다 parallel -X. 주석에 적힌 대로 새 셸을 시작하고 각 인수를 버퍼링하기 위해 파일을 여는 오버헤드가 원인일 수 있습니다.

따라서 GNU Parallel은 xargs만큼 빠르지 않습니다. 작업당 예상되는 오버헤드는 10밀리초입니다. -X를 사용하면 작업에서 더 많은 매개변수를 처리할수록 이 오버헤드가 덜 중요해집니다.

관련 정보