2016-08-29 2 views
0

私は1分以内に5ずつ増加するファイルのリストを持っています。私はこのデータをOracleのプロシージャを使用してデータベースに挿入しています。 (外部メソッドテーブル)Powershellのマルチスレッドとオラクルの手順

次に、以下のようにPowershellからこのプロシージャを呼び出します。

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

これは問題ありません。しかし、それは長い時間がかかり、スピードアップしたかった。 マルチスレッドまたはマルチプロセッシングを使用する方が良いですか? 私はWindowsタスクスケジューラでこのpowershellスクリプトを設定する予定です。

+0

リストはどのように「1分以内に5ずつ増加しますか」?あなたは精緻化できますか? –

+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に入れて、それを認識できるようにしてください。 –