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.
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?
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.
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
Tags shell utilities parallelism