Как настроить PowerShell на сборку объектов .NET, таких как XmlSchemaSet?

Я создал сценарий PowerShell, который перебирает большое количество файлов схемы XML (.xsd) и для каждого создает объект .NETXmlSchemaSet , вызывает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. Просто запустите его и наблюдайте за увеличением использования памяти в Диспетчере задач или Обозревателе процессов.)

Вдохновленный некоторыми сообщениями в блоге, я попытался добавить

remove-variable reader, schemaSet

Я также попытался подобрать схему $из . ] Add()и выполнение

[void] $schemaSet.RemoveRecursive($schema)

Кажется, что они имеют некоторый эффект, но все же есть утечка. Я предполагаю, что более старые экземпляры XmlSchemaSetвсе еще используют память без сбора мусора.

Вопрос: Как правильно научить сборщик мусора тому, что он может освобождать всю память, используемую в приведенном выше коде? Или в более общем плане: как я могу достичь своей цели с ограниченным объемом памяти?

11
задан MarnixKlooster ReinstateMonica 27 June 2012 в 09:15
поделиться