Jak nakazać PowerShellowi usuwanie śmieci z obiektów .NET, takich jak XmlSchemaSet?

Stworzyłem skrypt PowerShell, który zapętla dużą liczbę plików XML Schema (.xsd) i dla każdego tworzy .NETXmlSchemaSet obiekt, połączeniaAdd() iCompile() aby dodać do niego schemat i wypisuje wszystkie błędy sprawdzania poprawności.

Ten skrypt działa poprawnie, ale gdzieś jest przeciek pamięci, powodując zużycie gigabajtów pamięci w przypadku uruchomienia na 100 plikach.

To, co zasadniczo robię w pętli, jest następujące:

$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()

(Pełny skrypt do odtworzenia tego problemu można znaleźć w tym opisie:https://gist.github.com/3002649. Wystarczy go uruchomić i obserwować wzrost wykorzystania pamięci w Menedżerze zadań lub Eksploratorze procesów.)

Zainspirowany przez niektóre wpisy na blogu, spróbowałem dodać

remove-variable reader, schemaSet

Próbowałem też podnieść$schema zAdd() i robiąc

[void] $schemaSet.RemoveRecursive($schema)

Wydaje się, że mają one jakiś wpływ, ale wciąż jest przeciek. Zakładam, że starsze przykładyXmlSchemaSet wciąż używają pamięci bez zbierania śmieci.

Pytanie: Jak prawidłowo nauczyć śmieciarka, że ​​może odzyskać całą pamięć użytą w powyższym kodzie? Lub bardziej ogólnie: jak mogę osiągnąć mój cel przy ograniczonej ilości pamięci?

questionAnswers(2)

yourAnswerToTheQuestion