2011-08-03 20 views
2

私はC#で書かれたSSISスクリプトタスクを持っています。これをPowerShellに移植してスクリプトとして使用したいと考えています。 C#のバージョンは12.1秒で実行されますが、PowerShellのバージョンでは100.5秒ほどの時間がかかります。私は、フォーマットのそれぞれで約3~4万行と11個のテキストファイル(CSV)を処理しています:パフォーマンスチューニングpowershellテキスト処理

<TICKER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL> 
AUDJPY,20010102,230100,64.30,64.30,64.30,64.30,4 
AUDJPY,20010102,230300,64.29,64.29,64.29,64.29,4 
<snip> 

私は単純に、列が20110101の日付を持って新しいファイルに内容を書きたいですまたはそれ以降。ここに私のC#のバージョンがあります:

private void ProcessFile(string fileName) 
    { 
     string outfile = fileName + ".processed"; 
     StringBuilder sb = new StringBuilder(); 
     using (StreamReader sr = new StreamReader(fileName)) 
     { 
      string line; 
      int year; 
      while ((line = sr.ReadLine()) != null) 
      { 
       year = Convert.ToInt32(sr.ReadLine().Substring(7, 4)); 
       if (year >= 2011) 
       { 
        sb.AppendLine(sr.ReadLine()); 
       } 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(outfile)) 
     { 
      sw.Write(sb.ToString()); 
     } 
    } 

ここに私のPowerShellのバージョンがあります:

foreach($file in ls $PriceFolder\*.txt) { 
    $outFile = $file.FullName + ".processed" 
    $sr = New-Object System.IO.StreamReader($file) 
    $sw = New-Object System.IO.StreamWriter($outFile) 
    while(($line = $sr.ReadLine() -ne $null)) 
    {  
     if ($sr.ReadLine().SubString(7,4) -eq "2011") {$sw.WriteLine($sr.ReadLine())} 
    } 
} 

は、どのように私はSSISの私のC#スクリプトタスクで取得することができますPowerShellで同じ性能を得ることができますか?

+0

興味深いことに、両方のループの例でReadLine()を3回呼び出す予定ですか?それは1行をスキップし、2番目に一致し、3番目を印刷して、繰り返すように見えます。 –

答えて

2

実際にPowerShellでC#を正しく使用していない限り、PowerShellのパフォーマンスはC#と同等です。 Add-Typeコマンドレットを使用すると、通常は簡単なC#スニペットをコンパイルし、スクリプトから直接呼び出すことができます。パフォーマンスが問題であり、何らかの理由でC#アセンブリの使用が不可能な場合、私はこのようにします。

ここでの例を参照してください。http://go.microsoft.com/fwlink/?LinkID=135195

1

あなたはすべての場合に理想的ではないかもしれないPowershellにC#を翻訳しています。はい、C#を使用するとパフォーマンスが向上しますが、Powershellと比較してパフォーマンスを向上させることはできません。

Powershellパイプラインで「ストリーミング」を試してみてください。例えば

、のようなもの:オブジェクトは、すぐに彼らが利用できるようパイプラインに沿って渡されるよう

gc file.txt | ?{ process.....} | %{process...} | out-file out.txt 

は速いだろう。

Get-Contentとパイプラインを使用して同等の機能を試すことはできますか?

関連する問題