
サードパーティの .exe コマンドライン アプリケーションを使用して、50,000 を超えるファイルを処理する必要があります。アプリケーションは一度に 1 つの入力ファイルしか受け付けないため、アプリケーションを 50,000 回以上起動する必要があります。
各ファイル(各ジョブ)の処理には通常 1 秒程度かかります。ただし、アプリケーションが無期限にハングする場合もあります。
すべてのジョブをシリアルに実行し、ジョブが完了したかどうかを毎秒チェックする Windows シェル スクリプトを作成しました。10 秒後にジョブを強制終了して次のジョブに進みます。ただし、これには約 20 時間かかります。複数のジョブを並列に実行すれば、合計実行時間を大幅に短縮できると思います。問題は、どのようにするかです。
CMD では Start でタスクを起動しますが、プロセス ID (PID) を回復する簡単な方法がないため、どのインスタンスがどのくらいの時間実行されたかを簡単に追跡できません。傘を再発明しようとしているような気がします。何か提案はありますか?
答え1
パワーシェルあなたの友だちです。
https://serverfault.com/questions/626711/ジョブを使用せずに並列で Powershell スクリプトを実行する方法同様の質問をします。
「速い」と「堅牢」は、もちろん主観的なものです。
答え2
quadruplebucky の回答に示されているように、Powershell でうまくいきました。使用したコードは次のとおりです。最後から 2 番目の行 ( ./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
同時に実行されるインスタンスの最大数を設定します。