
我需要使用第三方 .exe 命令列應用程式處理超過 50,000 個檔案。該應用程式一次只需要一個輸入文件,因此我必須啟動該應用程式 >50,000 次。
每個文件(每個作業)通常需要大約一秒鐘。但是,有時應用程式會無限期掛起。
我編寫了一個 Windows shell 腳本,它連續運行所有作業,並每秒檢查作業是否完成。 10 秒後,它會終止該作業並繼續下一個作業。不過,大約需要20個小時。我相信如果我並行運行多個作業,我可以大大降低總運行時間。問題是如何?
在 CMD 中,我使用 Start 啟動任務,但沒有簡單的方法來恢復進程 ID (PID),因此我無法輕鬆追蹤哪個執行個體運行了多長時間。我覺得我正在嘗試重新發明雨傘。有什麼建議麼?
答案1
電源外殼是你的朋友。
「快速」和「穩健」當然是主觀的。
答案2
正如 Quadruplebucky 的回答所示,Powershell 做到了這一點。這是我使用的程式碼。倒數第二行 ( ./xml2csv...
) 是作業本身。腳本的其餘部分可以重複用於任何類似的任務。
# 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
}
一些注意事項:
- 呼叫並行函數(又名小指令)可以下載這裡。
- 運行空間就是我所說的「實例」。
-runspaceTimeout
提供每個實例的最大運行時間。 -throttle
設定同時運行實例的最大數量。