Я создал PowerShell script, который перебирает большое количество файлов XML Schema (.xsd) и для каждого создает объект .NET XmlSchemaSet
, вызывает Add()
и Compile()
, чтобы добавить к нему схему, и распечатывает все ошибки проверки.
Этот script работает корректно, но где-то есть утечка памяти, из-за чего он потребляет гигабайты памяти, если запускается на 100. файлов.
В основном я делаю в цикле следующее:
$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()
(Полный script, чтобы воспроизвести эту проблему, можно найти в этом значении: https://gist.github.com/3002649. Просто запустите его и просмотрите увеличение использования памяти в Задаче Manager или Process Explorer.)
Вдохновленный некоторыми сообщениями в блоге, я попытался добавить
remove-variable reader, schemaSet
Я также попытался собрать $schema
из Add()
и сделать
[void] $schemaSet.RemoveRecursive($schema)
Кажется, что они имеют какой-то эффект, но все же есть утечка. Я предполагаю, что более старые экземпляры XmlSchemaSet
по-прежнему используют память без сбора мусора.
Вопрос: Как правильно учить сборщик мусора, чтобы он мог вернуть всю память, используемую в коде выше? Или в целом: как я могу достичь своей цели с ограниченным объемом памяти?