O find(1)
utilitário unix é muito útil, permitindo-me executar uma ação em muitos arquivos que correspondem a determinadas especificações, por exemplo
find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;
O acima pode executar um script ou ferramenta em cada arquivo XML em um diretório específico.
Digamos que meu script / programa consome muito tempo de CPU e eu tenho 8 processadores. Seria bom processar até 8 arquivos por vez.
O GNU make permite o processamento paralelo de trabalhos com o -j
sinalizador, mas find
não parece ter essa funcionalidade. Existe um método genérico alternativo de agendamento de tarefas para abordar isso?
-P
opção!xargs -P
- ele tem um bug nunca corrigido de iludir a saída (ao contrárioparallel
) sempre que 2 threads produzem saída no mesmo momento exato ...O paralelo GNU também pode ajudar.
Observe que, sem o
-j8
argumento, oparallel
padrão é o número de núcleos em sua máquina :-)fonte
Não há necessidade de "consertar"
find
- use-make
se para lidar com o paralelismo.Faça com que seu processo crie um arquivo de log ou outro arquivo de saída e use um Makefile como este:
e invocado assim:
Melhor ainda, se você garantir que o arquivo de saída seja criado apenas após a conclusão bem-sucedida do processo Java, poderá aproveitar
make
o manuseio de dependências para garantir que da próxima vez apenas arquivos não processados sejam executados.fonte
O Find tem uma opção paralela que você pode usar diretamente usando o símbolo "+"; não é necessário xargs. Combinando-o com o grep, ele pode rasgar sua árvore rapidamente, procurando correspondências. por exemplo, se estou procurando todos os arquivos no meu diretório de fontes que contêm a string 'foo', posso chamar
find sources -type f -exec grep -H foo {} +
fonte
-exec command +
sintaxe não a executa paralelamente, mas "agrupa" muitos arquivos e executa o comando com vários arquivos como argumentos ao mesmo tempo. Acontece que o grep pode examinar seus objetivos em paralelo.