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

1

Eu preciso processar > 50.000 arquivos usando um aplicativo de linha de comando .exe de terceiros. O aplicativo usa apenas um arquivo de entrada de cada vez, por isso preciso iniciar o aplicativo > 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 cada segundo para ver se o trabalho está concluído. Após 10 segundos, ele mata o trabalho e passa para o próximo. No entanto, demora cerca de 20 horas. Acredito que posso diminuir o tempo de execução total em grande quantidade, se eu 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 a ID do processo (PID) e, portanto, não consigo controlar com facilidade qual instância foi executada por quanto tempo. Eu sinto que estou tentando reinventar o guarda-chuva. Alguma sugestão?

    
por Mattia Landoni 14.08.2017 / 04:12

2 respostas

0

PowerShell é seu amigo.

  link pergunta algo semelhante .

"Rápido" e "robusto" são obviamente subjetivos.

    
por 14.08.2017 / 04:25
2

Powershell fez o truque, como indicado na resposta quadruplebucky. Aqui está o código que usei. A segunda e última linha ( ./xml2csv... ) é o trabalho em si. O restante do script pode ser reutilizado para tarefas semelhantes.

# 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 como cmdlet ) pode ser baixada aqui .
  • 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.
por 14.08.2017 / 22:14