GNU paralelo excessivamente lento

4

Eu preciso executar grep em alguns milhões de arquivos. Por isso, tentei acelerá-lo, seguindo as duas abordagens mencionadas aqui : xargs -P -n e GNU parallel . Eu tentei isso em um subconjunto dos meus arquivos (9026 em número), e este foi o resultado:

  1. Com xargs -P 8 -n 1000 , muito rápido:

    $ 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. Com parallel , muito lento:

    $ 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. Até% xargs sequencial é mais rápido que 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 não funciona para mim porque a saída de todos os processos é intercalada, o que não acontece com parallel . Então, eu gostaria de usar parallel sem incorrer nessa grande lentidão.

Alguma idéia?

UPDATE

  1. Seguindo a resposta de Ole Tange , experimentei parallel -X , os resultados estão aqui, para conclusão:

    $ 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. A solução mais rápida: Após o comentário de @cas < Eu tentei grep com -H opção (para forçar a impressão de nomes de arquivos) e classificação. Resultados aqui:

    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
    
por nofrills 30.03.2016 / 18:15

1 resposta

4

Experimente parallel -X . Conforme escrito nos comentários, a sobrecarga de iniciar um novo shell e abrir arquivos para armazenamento em buffer para cada argumento é provavelmente a causa.

Esteja ciente de que o GNU Parallel nunca será tão rápido quanto xargs por causa disso. Espere uma sobrecarga de 10 ms por trabalho. Com -X, essa sobrecarga é menos significativa à medida que você processa mais argumentos em um trabalho.

    
por 31.03.2016 / 08:40