
타사 .exe 명령줄 응용 프로그램을 사용하여 50,000개가 넘는 파일을 처리해야 합니다. 애플리케이션은 한 번에 하나의 입력 파일만 사용하므로 애플리케이션을 50,000회 이상 실행해야 합니다.
각 파일(각 작업)은 일반적으로 약 1초 정도 걸립니다. 그러나 때로는 응용 프로그램이 무기한 중단되는 경우도 있습니다.
나는 모든 작업을 순차적으로 실행하고 작업이 완료되었는지 매초 확인하는 Windows 셸 스크립트를 작성했습니다. 10초 후에 작업이 종료되고 다음 작업으로 넘어갑니다. 그러나 약 20시간이 소요됩니다. 여러 작업을 병렬로 실행하면 전체 런타임을 크게 줄일 수 있다고 생각합니다. 문제는 어떻게?
CMD에서는 시작을 사용하여 작업을 시작하지만 프로세스 ID(PID)를 복구하는 간단한 방법이 없으므로 어떤 인스턴스가 얼마나 오랫동안 실행되었는지 쉽게 추적할 수 없습니다. 우산을 재발명하려는 것 같은 느낌이 듭니다. 어떤 제안이 있으십니까?
답변1
파워셸당신의 친구입니다.
https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobs비슷한 것을 묻습니다.
"빠름"과 "견고함"은 물론 주관적입니다.
답변2
Quadruplebuky의 답변에 표시된 대로 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 함수(일명cmdlet) 다운로드 가능여기.
- Runspace는 제가 "인스턴스"라고 부르는 것입니다.
-runspaceTimeout
각 인스턴스에 대한 최대 실행 시간을 제공합니다. -throttle
동시에 실행되는 최대 인스턴스 수를 설정합니다.