Powershell内存使用 - 价格昂贵?

use*_*004 5 powershell

我是powershell的新手,但已经编写了一些在windows2003服务器上运行的脚本.它肯定比cmd脚本更强大(可能是因为我有编程背景).但是,当我进一步深入研究时,我注意到:

  1. 启动的每个脚本都将在1个PowerShell进程下运行,即.您会看到每个脚本的新PowerShell进程.
  2. 我测试内存的脚本非常简单,比如说,构建一个字符串或查询一个环境变量,然后启动 - 睡眠60秒,所以没什么需要(关于内存使用情况).但每个过程大约需要30MB.叫我吝啬,但因为有计划内存密集型应用程序每天运行,如果我需要安排一些PowerShell脚本定期运行,也许某些脚本作为服务连续运行,我当然会尝试将内存消耗保持为尽可能低.< - 这是因为我们最近因内存不足而遇到大量应用程序故障.

我还没有谈到C#,但有人会认为用C#编写任务有时候会更好吗?

同时,我在powershell中看过有关内存泄漏的帖子.我是否认为脚本创建的内存将与powershell的进程空间一致,因此当脚本终止因此powershell终止时,创建的内存会被清除?

And*_*ndi 5

我的PowerShell.exe 2.0本身(不运行脚本)在XP上大约是30MB.这些天,每台机器的平均内存不应过多担心.关于内存泄漏,有些情况下,当对象没有得到妥善处理时,人们使用第三方库存在内存泄漏.要解决那些必须手动调用垃圾收集器的问题[gc]::Collect(),但这种情况很少见.其他时候我见过人们使用它Get-Content来读取一个非常大的文件并在使用之前将其分配给变量.这也将占用大量内存.在这种情况下,您可以使用管道一次读取文件部分以减少内存占用.

  • 当您可以流式传输工作时,PowerShell工作效率最高,即一次操作一个项目,而不是将所有项目存储在变量中供以后使用(如本答案中所指出的).即使在流式方案中,您也必须注意某些无法流式传输的cmdlet,例如Sort-Object,Group-Object和Format-Table,并指定了-AutoSize参数. (2认同)

lat*_*kin 5

1 - 是的,创建了一个新流程.运行cmd脚本,vb脚本或C#编译的可执行文件时也是如此.

2 - 加载powershell主机和运行时将占用一些非常重要的内存,这些内存因系统和版本而异.它通常是一个比cmd shell或专用C#exe更重的进程.对于那些MB,您将获得丰富的运行时和库支持,使Powershell如此强大.

普通的留言:

  • 操作系统为每个进程分配内存.一旦进程终止,它的所有内存都将被回收.这是任何现代操作系统的一般设计,并不是特定于Powershell甚至Windows.
  • 如果您的团队在硬件上运行业务关键型应用程序,使少数30MB进程可能导致灾难性故障,那么您就会遇到更大的问题.打开浏览器并访问Facebook会占用更多内存.
  • 在你花时间找出一些神秘的批处理脚本解决方案的时候,你可以在Powershell中创建一个更好的解决方案,而你的公司可以负担得起新的专用硬件,节省了可计费小时数:-)
  • 您应该使用最适合工作的工具.Powershell 通常是正确的工具,但并非总是如此.它非常适合在Windows环境中自动执行管理任务(文件处理,使用AD,计划任务,设置权限等).它对于高性能,大量算法任务或针对原始.NET API的复杂编码来说不太好.对于这些任务,C#会更有意义.
  • Powershell得到了微软(以及一个大用户社区!)的巨大支持/支持,并且已经非常明确地表明它是Windows的首选脚本环境.所有适用于Windows的新服务器端技术都支持PowerShell.如果您在管理员/ IT部门工作,那么在Powershell中建立一些技能将是一项明智的投资.我永远不会阻止某人学习C#,但如果你的角色比开发人员更多,那么Powershell将会更频繁地成为正确的工具,你的同事也更有可能理解它.