多数の XML スキーマ (.xsd) ファイルをループ処理する PowerShell スクリプトを作成し、それぞれに対して .NETXmlSchemaSet
オブジェクトを作成し、 and を呼び出しAdd()
てCompile()
スキーマを追加し、すべての検証エラーを出力します。
このスクリプトは正しく動作しますが、どこかにメモリ リークがあり、数百のファイルで実行すると数ギガバイトのメモリが消費されます。
私が基本的にループで行うことは次のとおりです。
$schemaSet = new-object -typename System.Xml.Schema.XmlSchemaSet
register-objectevent $schemaSet ValidationEventHandler -Action {
...write-host the event details...
}
$reader = [System.Xml.XmlReader]::Create($schemaFileName)
[void] $schemaSet.Add($null_for_dotnet_string, $reader)
$reader.Close()
$schemaSet.Compile()
(この問題を再現するための完全なスクリプトは、https ://gist.github.com/3002649 の Gistにあります。実行するだけで、タスク マネージャーまたはプロセス エクスプローラーでメモリ使用量の増加を確認できます。)
いくつかのブログ投稿に触発されて、追加してみました
remove-variable reader, schemaSet
$schema
私もから拾ってAdd()
やってみました
[void] $schemaSet.RemoveRecursive($schema)
これらはある程度の効果があるようですが、それでも漏れがあります。XmlSchemaSet
の古いインスタンスは、ガベージ コレクションを行わずにメモリを使用していると推測しています。
質問:上記のコードで使用されたすべてのメモリを再利用できることをガベージ コレクターに正しく教えるにはどうすればよいでしょうか。または、より一般的には、限られた量のメモリで目標を達成するにはどうすればよいですか?