2012-10-16 37 views
3

在PowerShell中,重定向標準輸入到一個文件的正常方式是管道中的文件的內容:標準輸入重定向要在PowerShell中大型文件 - 內存消耗

Get-Content input-file.txt | Write-Host 

但是,如果該文件是非常大型PowerShell開始消耗大量內存。使用小型的-ReadCount似乎加快了開始向命令饋送行的速度,但內存消耗仍然很大。

爲什麼內存使用率如此之高? PowerShell是否將文件的內容保留在內存中,即使它不需要?有什麼方法可以緩解這種情況嗎?

回答

4

以下函數將通過使用.NET類StreamReader類逐行讀取文件,並將每條線沿管道向下發送。

function Get-ContentByLine { 
    param (
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)][PsObject]$InputObject 
) 

    begin { 
    $line = $null 
    $fs = [System.IO.File]::OpenRead($InputObject) 
    $reader = New-Object System.IO.StreamReader($fs) 
    } 

    process { 
    $line = $reader.ReadLine() 
    while ($line -ne $null) { 
     $line 
     $line = $reader.ReadLine() 
    } 
    } 

    end { 
    $reader.Dispose(); 
    $fs.Dispose(); 
    } 
} 

你會調用它像這樣:

發送這 Out-Null它正在執行一個近200萬行的日誌文件(〜186   MB),而我的內存使用量僅上升了KB的幾個10的
PS C:\> Get-ContentByLine "C:\really.big.log" | Out-Null 
+1

有趣。當然,使用.NET是有道理的,但我從來沒有見過begin/process/end。 [一些細節](http://ss64.com/ps/syntax-function-input.html)對於像我這樣陌生的人。如果PowerShell已經內置了類似的東西,那將會非常好。 – jpmc26

0

this article提出了一種可能的解決方案。使用舊的命令行:

cmd.exe /C "ECHO < input-file.txt" 

舊樣式輸入重定向不以相同的方式消耗內存。

但是,這是非常醜陋的,讓你做一些奇怪的事情來構建更復雜的命令。我更喜歡純粹的PowerShell解決方案。