Executando um grande número de pequenos trabalhos no Windows, em paralelo, com capacidade de tempo limite

Executando um grande número de pequenos trabalhos no Windows, em paralelo, com capacidade de tempo limite

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". -runspaceTimeoutfornece o tempo máximo de execução para cada instância.
  • -throttledefine o número máximo de instâncias em execução simultâneas.

informação relacionada