
Ich muss >50.000 Dateien mit einer .exe-Befehlszeilenanwendung eines Drittanbieters verarbeiten. Die Anwendung akzeptiert jeweils nur eine Eingabedatei, daher muss ich die Anwendung >50.000 Mal starten.
Jede Datei (jeder Job) dauert normalerweise etwa eine Sekunde. Manchmal bleibt die Anwendung jedoch auf unbestimmte Zeit hängen.
Ich habe ein Windows-Shell-Skript geschrieben, das alle Jobs nacheinander ausführt und jede Sekunde prüft, ob der Job erledigt ist. Nach 10 Sekunden beendet es den Job und fährt mit dem nächsten fort. Das dauert jedoch etwa 20 Stunden. Ich glaube, ich kann die Gesamtlaufzeit erheblich verkürzen, wenn ich mehrere Jobs parallel ausführe. Die Frage ist, wie?
In CMD starte ich die Aufgabe mit „Start“, aber es gibt keine einfache Möglichkeit, die Prozess-ID (PID) wiederherzustellen, und daher kann ich nicht einfach verfolgen, welche Instanz wie lange ausgeführt wurde. Ich habe das Gefühl, als würde ich versuchen, den Schirm neu zu erfinden. Irgendwelche Vorschläge?
Antwort1
Power Shellist dein Freund.
https://serverfault.com/questions/626711/wie-führe-ich-meine-Powershell-Skripte-parallel-aus-ohne-Jobs-zu-verwendenfragt etwas Ähnliches.
„Schnell“ und „robust“ sind natürlich subjektiv.
Antwort2
Powershell hat es geschafft, wie in quadruplebuckys Antwort angegeben. Hier ist der Code, den ich verwendet habe. Die vorletzte Zeile ( ./xml2csv...
) ist der Job selbst. Der Rest des Skripts kann für ähnliche Aufgaben wiederverwendet werden.
# 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
}
Einige Notizen:
- Die Invoke-Parallel-Funktion (auch bekannt alsCmdlet) kann heruntergeladen werdenHier.
- Ein Runspace ist das, was ich eine „Instanz“ genannt hätte.
-runspaceTimeout
Bietet die maximale Laufzeit für jede Instanz. -throttle
legt die maximale Anzahl gleichzeitig laufender Instanzen fest.