
Preciso processar mais de 50.000 arquivos usando um aplicativo de linha de comando .exe de terceiros. O aplicativo usa apenas um arquivo de entrada por vez, então preciso iniciá-lo mais de 50.000 vezes.
Cada arquivo (cada trabalho) geralmente leva cerca de um segundo. No entanto, às vezes o aplicativo trava indefinidamente.
Eu escrevi um script de shell do Windows que executa todos os trabalhos em série e verifica a cada segundo se o trabalho foi concluído. Após 10 segundos, ele encerra o trabalho e passa para o próximo. No entanto, leva cerca de 20 horas. Acredito que posso reduzir bastante o tempo de execução total se executar vários trabalhos em paralelo. A questão é como?
No CMD, inicio a tarefa com Iniciar, mas não há uma maneira simples de recuperar o ID do processo (PID) e, portanto, não consigo controlar facilmente qual instância foi executada por quanto tempo. Sinto que estou tentando reinventar o guarda-chuva. Alguma sugestão?
Responder1
Powershellé seu amigo.
https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobspergunta algo semelhante.
"Rápido" e "robusto" são obviamente subjetivos.
Responder2
Powershell resolveu o problema, conforme indicado na resposta de quadruplebucky. Aqui está o código que usei. A penúltima linha ( ./xml2csv...
) é o trabalho em si. O restante do script pode ser reutilizado para qualquer tarefa semelhante.
# PARAMETERS
$root = 'D:\Ratings'
$folder = 'SP'
# Import Invoke-Parallel
.".\Invoke-Parallel.ps1"
# Run in parallel
Get-ChildItem ".\$folder-xml" -Filter *.xml |
Invoke-Parallel -throttle 10 -runspaceTimeout 10 -ImportVariables `
-ScriptBlock {
$file = $_.BaseName
echo $file
cd $root
(./xml2csv $folder-xml\$file.xml $folder-csv\$file.csv fields-$folder.txt -Q) | out-null
}
Algumas notas:
- A função Invoke-Parallel (também conhecida comocmdlet) pode ser baixadoaqui.
- Um runspace é o que eu chamaria de "instância".
-runspaceTimeout
fornece o tempo máximo de execução para cada instância. -throttle
define o número máximo de instâncias em execução simultâneas.