2016-08-29 4 views
0

1 분 이내에 끝까지 종료되지 않는 파일 목록이 있습니다. 이 데이터를 Oracle 프로 시저를 사용하여 데이터베이스에 삽입합니다. (메서드 외부 테이블)Powershell 다중 스레드 및 오라클 절차

다음 Powershell에서이 프로 시저를 호출합니다.

ForEach ($file in $files) { 
    #executing the calculate procedure  
    executeStoredProcedure -value sp_load_table_crm -filename $file.Name -conn 
} 

괜찮습니다. 그러나 그것은 오랜 시간이 걸리고 속도를 높이고 싶었습니다. 멀티 스레딩 또는 멀티 프로세싱을 사용하는 것이 더 좋습니다. 나는 창 task scheduler에이 powershell 원본을 설치하는 것을 계획하고있다.

+0

목록은 어떻게 "1 분 안에 끝이 없나요?" 당신은 정교 할 수 있습니까? –

+0

나는 "다른 프로세스가 실행 중이며 특정 폴더에 파일을 전송하고 파일 수가 1 분에 5 개의 파일만큼 증가합니다"라는 의미입니다. 따라서로드 프로세스가 매번 실행되어야합니다. 일단 DB에 삽입 한 특정 폴더에서 파일을 제거합니다. – user347918

+0

아니면 DBMS_PARALLEL_EXECUTE.run_task를 사용해야합니까? 나는 누군가가 경험을 가지고 있다면 어떤 방향으로 나아질 지 결정할 필요가있다. – user347918

답변

2

실행 영역을 사용할 수 있습니다. 이것을 시도하십시오 :

$Files = @('File1','File2','File3') #list of your files 

$Throttle = 10 #number of threads 
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $Throttle) 
$RunspacePool.Open() 

$Jobs = @() 
$ScriptBlock = { 
    Param($File) 
    #place your executeStoredProcedure function inside the script block or make sure it will be loaded with the appropriate module via profile  
    executeStoredProcedure -value sp_load_table_crm -filename ($File.Name) -conn #heres your function and its parameters 
} 

$Files | % { 
    $File = $_ 
    $Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($File) 
    $Job.RunspacePool = $RunspacePool 
    $Jobs += New-Object PSObject -Property @{ 
     Pipe = $Job 
     Result = $Job.BeginInvoke() 
    } 
} 

Write-Host "Waiting.." -NoNewline 
Do { 
    Write-Host "." -NoNewline 
    Start-Sleep -Seconds 1 
} While ($Jobs.Result.IsCompleted -contains $false) 
Write-Host "All jobs completed!" 

$Results = @() 
ForEach ($Job in $Jobs) 
{ $Results += $Job.Pipe.EndInvoke($Job.Result) 
} 
$Results | ft -Wrap -AutoSize 
+0

잘못 입증되면 기쁘다. 나는 뭔가를 배웠다. O.P. 모두에게 도움이되기를 바랍니다. – shellter

+0

@KirillPashkov, 스크립트 주셔서 감사합니다,하지만 아무 문제가 작동하지만 그것은 프로 시저를 호출하지 않는 것. 스크립트없이 프로 시저를 호출하면 프로 시저가 powershell에서 호출됩니다. 그리고 나는이 대본에 데뷔했지만 과정은 어디에도 멈추지 않았습니다. 나는 실수를 저지르고있다. – user347918

+0

@ user347918, executeStoredProcedure 함수 defenition을 $ ScriptBlock에 넣어서 인식 할 수 있도록하십시오. –