我需要使用第三方 .exe 命令行应用程序处理超过 50,000 个文件。该应用程序每次只接受一个输入文件,因此我必须启动该应用程序超过 50,000 次。
每个文件(每个作业)通常需要大约一秒钟。但是,有时应用程序会无限期挂起。
我编写了一个 Windows shell 脚本,该脚本按顺序运行所有作业,并每秒检查一次作业是否完成。10 秒后,它会终止该作业并继续执行下一个作业。但是,这需要大约 20 小时。我相信如果我并行运行多个作业,我可以大大减少总运行时间。问题是如何做到?
在 CMD 中,我使用“开始”启动任务,但没有简单的方法来恢复进程 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
}
一些说明:
- Invoke-Parallel 函数(又名命令)可以下载这里。
- 运行空间就是我所说的“实例”。
-runspaceTimeout
为每个实例提供最长的运行时间。 -throttle
设置同时运行实例的最大数量。