Ejecutar una gran cantidad de trabajos pequeños en Windows, en paralelo, con capacidad de tiempo de espera

Ejecutar una gran cantidad de trabajos pequeños en Windows, en paralelo, con capacidad de tiempo de espera

Necesito procesar >50.000 archivos utilizando una aplicación de línea de comandos .exe de terceros. La aplicación solo toma un archivo de entrada a la vez, por lo que tengo que iniciar la aplicación más de 50.000 veces.

Cada archivo (cada trabajo) suele tardar aproximadamente un segundo. Sin embargo, a veces la aplicación se cuelga indefinidamente.

He escrito un script de shell de Windows que ejecuta todos los trabajos en serie y comprueba cada segundo para ver si el trabajo está realizado. Después de 10 segundos, finaliza el trabajo y pasa al siguiente. Sin embargo, se necesitan unas 20 horas. Creo que puedo reducir considerablemente el tiempo de ejecución total si ejecuto varios trabajos en paralelo. La pregunta es ¿cómo?

En CMD lanzo la tarea con Inicio, pero no existe una forma sencilla de recuperar el ID del proceso (PID) y, por lo tanto, no puedo realizar un seguimiento de qué instancia se ha ejecutado y durante cuánto tiempo. Siento que estoy intentando reinventar el paraguas. ¿Alguna sugerencia?

Respuesta1

Potencia Shelles tu amigo.

https://serverfault.com/questions/626711/cómo-ejecuto-mis-scripts-powershell-en-paralelo-sin-usar-trabajospregunta algo parecido.

"Rápido" y "robusto" son, por supuesto, subjetivos.

Respuesta2

Powershell funcionó, como se indica en la respuesta de quadruplebucky. Aquí está el código que utilicé. La penúltima línea ( ./xml2csv...) es el trabajo en sí. El resto del script se puede reutilizar para tareas similares.

# 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
  }

Algunas notas:

  • La función Invoke-Parallel (también conocida comocmdlet) se puede descargaraquí.
  • Un espacio de ejecución es lo que yo habría llamado una "instancia". -runspaceTimeoutproporciona el tiempo máximo de ejecución para cada instancia.
  • -throttleestablece el número máximo de instancias en ejecución simultáneas.

información relacionada