0

MS AD を更新し、エラーを txt ファイルに出力するために MySQL クエリを実行しています。コードは正常に動作しますが、数分後に「System.OutOfMemoryException」というエラーが発生します。

以下はコードの短い部分です。

Function Addmembers {

$query = "SELECT * FROM allstudents_groups"
$dtResult = New-Object "System.Data.DataTable"

$hashOptions = @{ } 
$hashOptions["strServer"] = "servername"
$hashOptions["strDatabase"] = "DB"  
$hashOptions["strUser"] = "user"
$hashOptions["strPassword"] = "pass"
$hashOptions["strQuery"] = $query
$dtResult = executeMYSQLQuery($hashOptions) 
$OU = "OU=Class Group,DC=company,DC=internal"

ForEach ($row in $dtResult){
    $result = $row.GroupName
    $resmember = $row.Members
    $out_file = "C:\Scripts\Users.txt"
    $studentOU = "OU=Users,OU=CHS,OU=Est,DC=Company,DC=internal"
    $resmember | %{$_.Split(',')} | %{
        If(Get-QADUser -PageSize 1000 -DontUseDefaultIncludedProperties -SizeLimit 0 -SearchRoot "$studentOU" -LdapFilter "(name=$_)")
        {Add-ADGroupMember -Identity $result -Members "$($_)"
        [System.GC]::Collect()
    }

Else
    {"$_" | out-file "$out_file" -append}
}}
[System.GC]::Collect()
}
$dtResult = $Null
}
Addmembers    

これは、コードがすべての DB を取得し、それをメモリに保持しようとしたためだと思います。ForEach-Object はメモリがいっぱいになるのを防ぐと思いますが、それはロジックをサポートしていないようです。[System.GC]::Collect() を IF ステートメント内に追加しようとしましたが、RAM の増加を止めることはできません。

4

2 に答える 2

0

結果セット全体をこの変数に保存しているようです。$dtResult

そのため、大きなレコードセットであると仮定すると、すべてのメモリを簡単に消費する可能性があります。以下のようなものを試すことができます。Foreach-Object は、すべてのオブジェクトをメモリ内に保持してから反復処理しようとするのではなく、各オブジェクトを受信時にパイプに送信します。

executeMYSQLQuery($hashOptions) | Foreach-Object {
   $result = $_.GroupName
   $resmember = $_.Members

   #etc...


}
于 2014-04-27T00:27:06.217 に答える