将标准输入重定向到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将文件内容保留在内存中,即使它不需要这样做?有什么方法可以缓解这种情况吗?我们建议了一种可能的解决方案。使用旧

在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