2012-01-17 20 views
6

第5列が満たされ、条件を満たさないレコードの数をカウントするために、大きなパイプ区切りファイルを解析する必要があります。PowerShell区切りテキスト解析スクリプトのパフォーマンスを改善するのに役立つ

PS C:\temp> gc .\items.txt -readcount 1000 | ` 
    ? { $_ -notlike "HEAD" } | ` 
    % { foreach ($s in $_) { $s.split("|")[4] } } | ` 
    group -property {$_ -ge 256} -noelement | ` 
    ft –autosize 

このコマンドは、私はこのような出力を返して、欲しいものを行います。

 
    Count Name 
    ----- ---- 
1129339 True 
2013703 False 

しかし、500メガバイトのテストファイルのために、このコマンドは、Measure-Commandコマンドによって測定されるように実行するのに約5.5分かかります。典型的なファイルは2GB以上であり、20分以上待つことは望ましくないほど長い。

このコマンドのパフォーマンスを向上させる方法がありますか?

たとえば、Get-ContentのReadCountに最適な値を決定する方法はありますか?それがなければ、同じファイルを完了するのに8.8分かかります。

+0

StreamReaderを試しましたか?私はGet-Contentがそれを使って何かをする前にファイル全体をメモリにロードすると思います。 – Gisli

+0

あなたはSystem.IOをインポートすることを意味しますか? – neontapir

+0

可能であれば、.netフレームワークを使用してください。私は、SQL Serverが優れた結果を出して生成する大規模なログファイルを読み込むことに慣れていました。私は大きなファイルを効率的に読むためにPowerShellで他の方法を知らないが、私は専門家ではない。 – Gisli

答えて

4

StreamReaderを試しましたか?私はGet-Contentがそれを使って何かをする前にファイル全体をメモリにロードすると思います。 Gisliのヒント@使用

StreamReader class

4

、ここで私がなってしまったスクリプトは次のとおりです。

param($file = $(Read-Host -prompt "File")) 
$fullName = (Get-Item "$file").FullName 
$sr = New-Object System.IO.StreamReader("$fullName") 
$trueCount = 0; 
$falseCount = 0; 
while (($line = $sr.ReadLine()) -ne $null) { 
     if ($line -like 'HEAD|') { continue } 
     if ($line.split("|")[4] -ge 256) { 
      $trueCount++ 
     } 
     else { 
      $falseCount++ 
     } 
} 
$sr.Dispose() 
write "True count: $trueCount" 
write "False count: $falseCount" 

それは私の性能要件を満たしている分程度、で同じ結果が得られます。

2

StreamReaderを使用して、非常に大きなIISログファイルを読み込んで、すべての一意のクライアントIPアドレスといくつかのperfメトリックを出力する別の例を追加するだけです。

$path = 'A_245MB_IIS_Log_File.txt' 
$r = [IO.File]::OpenText($path) 

$clients = @{} 

while ($r.Peek() -ge 0) { 
    $line = $r.ReadLine() 

    # String processing here... 
    if (-not $line.StartsWith('#')) { 
     $split = $line.Split() 
     $client = $split[-5] 
     if (-not $clients.ContainsKey($client)){ 
      $clients.Add($client, $null) 
     } 
    } 
} 

$r.Dispose() 
$clients.Keys | Sort 

Get-Contentに対して少し性能比較:

のStreamReader:完了:5.5秒、たpowershell.exe:35328キロバイトのRAM。

Get-Content:完了:23.6秒。 PowerShell.exe:1,110,524 KBのRAM。

関連する問題