executando um executável em paralelo dividindo a árvore do diretório de entrada

1

Comandos como find e grep se beneficiariam muito se fossem executados em paralelo. Existe um utilitário ou um programa que recebe um comando como um argumento e o faz rodar em paralelo executando vários threads do comando, cada um em um subconjunto da árvore de diretórios?

    
por Abdul 28.01.2014 / 19:11

3 respostas

2

O GNU xargs tem um comando -P para isso.

find . ... -print0 | xargs -r0P4 -n10 some-command

Será executado até 4 some-command s de cada vez com até 10 arquivos como argumento.

    
por 28.01.2014 / 21:13
1

Atualmente, comandos como find e grep são quase sempre vinculados a E / S: o disco é o gargalo, não a CPU. Nesses casos, se você executar várias instâncias em paralelo, elas competirão pela largura de banda de E / S e pelo cache, e assim serão mais lentas.

Com um comando que exige mais CPU ou, em casos raros (por exemplo, um RAID-1 muito rápido que não esteja ocupado com uma CPU lenta), você pode usar ferramentas como Paralelo GNU ou o -P option de versões recentes do GNU xargs.

Supondo que os nomes de arquivos não contenham novas linhas, os seguintes comandos invocam cpu_intensive_command em cada arquivo, com dois threads paralelos:

find -type f | xargs -I {} -P 2 cpu_intensive_command {}
find -type f | parallel -X --number-of-cpus=2 cpu_intensive_command {}

Uma estratégia alternativa é dividir o trabalho em duas partes que você estima que sejam aproximadamente iguais. Isso não requer ferramentas sofisticadas, mas não equilibra as tarefas entre os processadores.

cpu_intensive_command [a-m]* &
cpu_intensive_command [!a-m]*
wait
    
por 29.01.2014 / 02:27
0

Percorra o tutorial do GNU Parallel: link e assista aos vídeos de introdução: link

    
por 28.01.2014 / 20:00