
Мне нужно обработать >50 000 файлов с помощью стороннего .exe-приложения командной строки. Приложение принимает только один входной файл за раз, поэтому мне приходится запускать приложение >50 000 раз.
Обычно каждый файл (каждое задание) занимает около одной секунды. Однако иногда приложение зависает на неопределенный срок.
Я написал скрипт оболочки Windows, который последовательно запускает все задания и каждую секунду проверяет, выполнено ли задание. Через 10 секунд он убивает задание и переходит к следующему. Однако это занимает около 20 часов. Я считаю, что могу значительно сократить общее время выполнения, если запущу несколько заданий параллельно. Вопрос в том, как?
В CMD я запускаю задачу с помощью Start, но нет простого способа восстановить идентификатор процесса (PID), и поэтому я не могу легко отслеживать, какой экземпляр работал как долго. У меня такое чувство, что я пытаюсь заново изобрести зонтик. Есть предложения?
решение1
Powershellтвой друг.
https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobsспрашивает что-то подобное.
«Быстрый» и «надежный» — понятия, конечно, субъективные.
решение2
Powershell справился с задачей, как указано в ответе quadruplebucky. Вот код, который я использовал. Вторая с конца строка ( ./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
устанавливает максимальное количество одновременно запущенных экземпляров.