2016-08-29 1 views
0

Ich habe eine Liste von Dateien, die innerhalb von 1 Minuten um 5 erhöhen nie enden. Ich füge diese Daten in Datenbank ein, die Orakel-Prozedur verwendet. (Methode externe Tabelle)Powershell Multithread und Orakel-Verfahren

Dann rufe ich diese Prozedur von Powershell wie folgt auf.

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

Dies funktioniert in Ordnung. Aber es dauert lange und wollte schneller werden. Welches ist besser, Multithreading oder Multiprocessing zu verwenden? ich plane dieses Powershell-Skript auf Windows-Taskplaner einzurichten.

+0

Wie wird die Liste "um 5 in den 1 Minuten nie enden"? Kannst du es ausarbeiten? –

+0

ich meinte "es gibt andere Prozess läuft und Übertragung von Dateien in den spezifischen Ordner, die Anzahl der Dateien wird um 5 Dateien in 1 Minute erhöhen". Also sollte mein Ladevorgang jedes Mal ausgeführt werden. Ich werde Dateien aus bestimmten Ordner entfernen, sobald es in DB eingefügt. – user347918

+0

Oder sollte ich DBMS_PARALLEL_EXECUTE.run_task verwenden? Ich muss entscheiden, welcher Weg besser ist, wenn jemand Erfahrung hat, dann bitte mich anweisen – user347918

Antwort

2

Sie könnten Runspaces verwenden. Versuchen Sie dies:

$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

Froh, falsch bewiesen zu werden. Ich habe etwas gelernt. Ich hoffe es hilft dem O.P. Viel Glück für alle. – shellter

+0

@KirillPashkov, danke für das Skript, aber es funktioniert kein Problem, aber es scheint keine Prozedur aufrufen. Wenn ich Prozedur ohne Ihr Skript aufrufen, wurde die Prozedur in Powershell aufgerufen. Und ich habe dieses Skript debütiert, aber der Prozess war nirgends zu stoppen. Wo mache ich einen Fehler? – user347918

+0

@ user347918, stellen Sie sicher, dass Sie die executeStoredProcedure-Funktion defention in $ ScriptBlock setzen, damit sie es erkennen kann. –