Запуск сценария Powershell из файла msbuild .proj дает исключение System.OutOfMemoryException для больших XML-файлов.

Я создал сценарий powershell, который загружает несколько больших (50 МБ+) файлов XML и извлекает из него некоторые значения. Он отлично работает как отдельный скрипт (но медленно).

Когда я вызываю .ps1 из файла msbuild proj, он запускается нормально, но затем умирает при загрузке этого большого файла XML с исключением System.OutOfMemoryException.

"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" Test.proj

PowerShell 4.0

Мой обходной путь - использовать XMLReader вместо XMLDocument, чтобы он выполнял последовательное чтение, работал быстрее и не умирал под MSBUILD.

Хотя я доволен своим обходным решением, мне все еще интересно, почему у меня есть ограничения по памяти при выполнении ps1 из задачи msbuild?

Виновата ли в этом 32-битная версия MSBUILD? Или это по дизайну?


person serop    schedule 01.09.2015    source источник


Ответы (1)


Вы можете попытаться увеличить лимит памяти PowerShell< /а>:

При запуске сценариев в большой среде вы можете столкнуться с исключением в PowerShell, сообщающим о нехватке памяти.

PS-OutOfMemory

Чтобы получить значение объема памяти, доступного для каждой оболочки, выполните следующую команду:

PS-GetMaxMemoryPerShellMB

Квота PowerShell MaxMemoryPerShellMB по умолчанию составляет всего 150 МБ в v1 и v2 и 1024 МБ в v3. Но даже в PowerShell 3.0 большие объекты могут потреблять большие объемы памяти.

Исключение «недостаточно памяти» можно устранить, просто увеличив значение MaxMemoryPerShellMB. Для этого используйте следующую команду:

PS-SetMaxMemoryPerShellMB

Как показано на снимке экрана выше, вы можете снова запустить команду Get-Item, чтобы проверить команду.

Последнее: перезапустите службу winrm… и все готово :-)

Полное удаление лимита:

У меня были проблемы с ограничением памяти при запуске удаленных команд powershell, которые запускали Java-программы на этом удаленном хосте. Я обнаружил, что установка MaxMemoryPerShellMB на ноль эффективно снимает ограничение и позволяет запускать мою программу.

Set-Item .\MaxMemoryPerShellMB 0

Примечание:

...что этот параметр влияет только на оболочки WSMan, а не на сам PowerShell. Эти параметры предназначены только для удаленного компонента WSMan, который вызывает WinRM. Их также можно настроить через WinRM в командной строке.

Использованная литература:

person beatcracker    schedule 02.09.2015
comment
Спасибо за подробный ответ. Я видел эту страницу Scripting Guy, но не мог заставить ее работать. Ваши команды работают сразу :) Я проверю, сколько памяти дает MSBuild для моего скрипта. - person serop; 02.09.2015
comment
В качестве продолжения: при запуске из MSBuild сценарий показывает то же ограничение памяти 1024. Поэтому я сбрасываю максимум на 0. Что кое-что меняет: теперь больше нет исключения OutOfMemory, но все еще есть странное исключение о недопустимой вставке узла в XML. Пока я просто выбираю узел... Опять же, тот же автономный скрипт работает нормально. - person serop; 02.09.2015
comment
Выполнение скрипта из 32-битной Powershell дает исключения, аналогичные MSBuild. Поэтому я склонен думать, что 32-битная версия MSBuild ограничивает максимальный объем памяти для размера объекта до 2 ГБ. - person serop; 02.09.2015