从msbuild .proj文件运行Powershell脚本为大型XML文件提供System.OutOfMemoryException

时间:2015-09-01 18:33:18

标签: xml powershell msbuild xmlreader proj

我创建了一个powershell脚本,它可以加载一些大的(50MB +)XML文件,并从中检索一些值。它作为一个独立的脚本工作正常(但速度很慢)。

当我从msbuild proj文件调用.ps1时,它会正常启动,但是在加载带有System.OutOfMemoryException异常的大XML文件时就死了。

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

Powershell 4.0

我的解决方法是使用XMLReader而不是XMLDocument,因此它执行顺序读取,工作速度更快,并且不会在MSBUILD下死掉。

虽然我对我的解决方法感到满意,但我仍然想知道为什么从msbuild任务执行ps1时我有内存限制?

归咎于32位版本的MSBUILD吗?或者它是设计的?

1 个答案:

答案 0 :(得分:1)

您可以尝试increase PowerShell memory limit

  

在大型环境中运行脚本时,可能会遇到问题   PowerShell中的异常,告诉你内存不足。

     

PS-OutOfMemory

     

要获取每个shell可用内存量的值,请运行   以下命令:

     

PS-GetMaxMemoryPerShellMB

     

PowerShell MaxMemoryPerShellMB配额默认在v1中仅为150MB   和v2,以及v3中的1024MB。但即使在PowerShell 3.0大型对象下也是如此   可以消耗大量内存。

     

你可以通过增加来解决'内存不足'异常   值MaxMemoryPerShellMB。要完成此操作,请使用以下命令   命令:

     

PS-SetMaxMemoryPerShellMB

     

如上面的屏幕截图所示,您可以运行Get-Item命令   再次验证命令。

     

最后:重新启动winrm服务......然后你就完成了: - )

完全删除限制:

  

我遇到运行powershell远程命令的内存限制问题   在该远程主机上启动java程序。我找到了设置   MaxMemoryPerShellMB为零,有效地删除了限制并允许   我的程序运行

Set-Item .\MaxMemoryPerShellMB 0

注意:

  

...此设置仅影响WSMan shell而不影响PowerShell   本身。这些设置仅适用于WSMan的远程处理组件   致电WinRM。它们也可以通过WinRM在命令中配置   提示。

参考文献: