2010-12-15 26 views
3

私はC#で働いていると私は大きなテキストファイル(75メガバイト)私はStreamReaderをして​​ReadToEndでファイルを読み込むしようとした正規表現C#のテキストファイルから特定の行を取得するには?

と一致する行を保存したい を得たが、それはラムの400メガバイトを取ります

また、再度使用するとメモリ不足の例外が発生します。

私はその後File.ReadAllLines()を使用してみました:これはすべて素晴らしいですが、私の関数はメモリ取らdoesntが明確とIを終了するとき を思い出したときにのみ、使用メモリの300メガバイトが残ってる

string[] lines = File.ReadAllLines("file"); 

StringBuilder specialLines = new StringBuilder(); 


foreach (string line in lines) 

if (match reg exp) 

    specialLines.append(line); 

を関数を呼び出して行を実行します。 string [] lines = File.ReadAllLines( "file"); メモリが50MBまでクリアされているのを確認してから、200MBに再割り当てします

どうすればこのメモリをクリアすることができますか?あなたは、ファイルのライン・バイ・ラインを読むために、あなたが必要とするこれらの行を保存するためにStreamReader#ReadLineを使用することができます

答えて

6
 var file = File.OpenRead("myfile.txt"); 
     var reader = new StreamReader(file); 
     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 
      //evaluate the line here. 
     } 
     reader.Dispose(); 
     file.Dispose(); 
+1

また、 'FileStream'と' StreamReader'オブジェクトを処分することを忘れないでください。 –

+0

ありがとうございました。はい、もちろんそうです。 – eoldre

+3

ストリームを自分で作成する必要はなく、StreamReaderコンストラクターはファイル名を直接取得できます。また、EndOfStreamを使用して、ファイルの最後にいるかどうかを確認しないでください。StreamReaderがデータをバッファリングしているため、StreamReaderがすべての行を返す前にストリームの位置が最後になる可能性があります。 –

2

メモリ内のファイル全体を読み込む代わりに、テキストをストリーミングする必要があります。ここでは、拡張メソッドおよびLINQのを使用して、それを行うための方法です:

static class ExtensionMethods 
{ 
    public static IEnumerable<string> EnumerateLines(this TextReader reader) 
    { 
     string line; 
     while((line = reader.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

... 

var regex = new Regex(..., RegexOptions.Compiled); 
using (var reader = new StreamReader(fileName)) 
{ 
    var specialLines = 
     reader.EnumerateLines() 
       .Where(line => regex.IsMatch(line)) 
       .Aggregate(new StringBuilder(), 
         (sb, line) => sb.AppendLine(line)); 
} 
+1

+1 - .NET 4.0には既に実装されている同様のメソッドがあります。 – ChaosPandion

+0

@ChaosPandion、あなたは 'File.ReadLines'を意味しますか?今は良いですが、前に気づいたことはありません... –

+0

これは正しいです。振り返ってみるとおそらくそれを言及していたはずです。 :) – ChaosPandion

0

あなたは、あなたのファイルが巨大なことができる場合には、あなたのメモリフットプリントを低く保つために列挙子パターンを使用する必要があります。

関連する問題