将标准输入重定向到Powershell中的大文件-内存消耗
在PowerShell中,将标准输入重定向到文件的常规方法是通过管道传输文件内容:将标准输入重定向到Powershell中的大文件-内存消耗,powershell,memory-leaks,stdin,large-files,Powershell,Memory Leaks,Stdin,Large Files,在PowerShell中,将标准输入重定向到文件的常规方法是通过管道传输文件内容: Get-Content input-file.txt | Write-Host 但是,如果文件非常大,PowerShell将开始消耗大量内存。使用一个小的-ReadCount似乎可以加快Get Content开始向命令中输入行的速度,但内存消耗仍然很大 为什么内存使用率这么高?是不是PowerShell将文件内容保留在内存中,即使它不需要这样做?有什么方法可以缓解这种情况吗?我们建议了一种可能的解决方案。使用旧
Get-Content input-file.txt | Write-Host
但是,如果文件非常大,PowerShell将开始消耗大量内存。使用一个小的-ReadCount
似乎可以加快Get Content
开始向命令中输入行的速度,但内存消耗仍然很大
为什么内存使用率这么高?是不是PowerShell将文件内容保留在内存中,即使它不需要这样做?有什么方法可以缓解这种情况吗?我们建议了一种可能的解决方案。使用旧的命令行:
cmd.exe /C "ECHO < input-file.txt"
cmd.exe/C“ECHO
旧式输入重定向不会以相同的方式消耗内存
然而,这是非常难看的,它会让你做一些奇怪的事情来构建更复杂的命令。我更喜欢纯PowerShell解决方案。以下函数将使用.NET类逐行读取文件,并沿管道发送每一行。当它在将近2000000行日志文件(~186MB)上执行时,将其发送到我的内存使用量只增加了10 KB: 您可以这样调用它:
PS C:\> Get-ContentByLine "C:\really.big.log" | Out-Null
有趣。当然,使用.NET是有意义的,但我以前从未见过begin/process/end。对于像我这样不熟悉的人。如果PowerShell已经内置了类似的东西,那就太好了。
PS C:\> Get-ContentByLine "C:\really.big.log" | Out-Null