2009-03-05 22 views
2

Powershellのnoobから私を甘やかさないでください:-) 私は処理しなければならないいくらか大きなログファイル(600MB)を持っていますので、スクリプトは本質的に"Message Received"はそれらの行をトークン化し、出力ファイルにいくつかのトークンを出力します。Powershellのメモリ使用量

スクリプトのロジックは問題ありませんが、問題は、出力ファイルにファイルを書き込んだり、ファイルのサイズが大きくなったりすることです。また、powershellが利用するメモリ量も増えますメモリが枯渇するまで。

どのように私はこれを停止することができます示唆することはできますか?私は、一時ファイルにログを分割し、代わりに一時ファイルを処理して10MBと言うだけのことを考えましたか?

HERESに私のコード、あなたたちは与えることができる任意のヘルプは素晴らしい:-)あなたが効果的にそれが少しずつアクセスする代わりに、シーケンシャルのメモリ内のログファイル全体を保存している

Get-Date | Add-Content -Path d:\scripting\logparser\testoutput.txt 


$a = Get-Content D:\scripting\logparser\importsample.txt 


foreach($l in $a){ 
#$l | Select-String -Pattern "Message Received." | Add-Content -Path d:\scripting\logparser\testoutput.txt 
if 
    (($l | Select-String -Pattern "Message Received." -Quiet) -eq "True") 

    { 
    #Add-Content -Path d:\scripting\logparser\testoutput.txt -value $l 
    $var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8,$var9,$var10,$var11,$var12,$var13,$var14,$var15,$var16,$var17,$var18,$var19,$var20 = [regex]::split($l,'\s+') 
    Add-Content -Path d:\scripting\logparser\testoutput.txt -value $var1" "$var2" "$var3" "$var4" "$var16" "$var18 

    } 
else 
    {} 
} 
Get-Date | Add-Content -Path d:\scripting\logparser\testoutput.txt 

答えて

7

あなたはパイプに全力を尽くす場合は、一度に1つのオブジェクトのみ(お使いの場合は、ファイルから1行)は、メモリにする必要があります。

Get-Content $inputFile | Where-Object { $_ -match "Message Received" } | 
    foreach-object -process { 
    $fields = [regex]::split($_,'\s+') # An array is created 
    Add-Content -path $outputFile -value [String]::Join(" ", $fields[0,1,2,3,15,17]) 
} 

$fields[0,1,2,3,15,17]$fieldsの所与のインデックスの配列を作成します。

これは、Select-Objectに渡されるプロパティ名ではなく、式を使用して1つのパイプラインで実行できますが、あまり明確ではありません。

+0

おかげリチャード、あなたはイムにnoobのを見ることができますが、私は:-)そこに着くだろうと –

0

だろう。

ログファイルには、一度に各エントリを読み込み、絶対に必要以上にメモリに保存しないで、各エントリ(新しい行かもしれない)ごとにいくつかの内部デリミタがあると仮定します。

PowerShellのビルドに依存することはできません。これは、stupidに影響するためです。

私のコードサンプルを謝らなければならない、私のPowerShellは少し錆びている。

var $reader = Create-Object "System.IO.StreamReader" testoutput.txt 
var $s = "" 
while(($s = reader.ReadLine())!=null) 
{ 
    // do something with '$s' 
    // which would contain individual log entries. 
} 
$reader.Close() 
2

作業PowerShellの例:

$csvFile = "c:\test.txt" 

$file_reader = [System.IO.File]::OpenText($csvFile) 
$row = ""; 
while(($row = $file_reader.ReadLine()) -ne $null) 
{ 
    # do something with '$row' 
    Write-Host row: $row 
} 
$file_reader.Close()