2017-04-26 1 views
0

C#を使用して大きなテキストファイル(200MB以上)で特別なcaracterで終わるすべての電子メールをフィルタする、すべての電子メールをフィルタリングするより速い方法は、C#を使用して大きなテキストファイルに特別なcaractereで終了します。

var lines = File.ReadAllLines(file path); 

foreach(var line in lines) 
{ 
    if (line.EndsWith(myWord)) 
    { 
    outputEmails.Text += line + Environment.NewLine; 
    } 
} 

このコードは私の目標を達成するのが非常に遅いです。

+0

使用ストリームリーダーの代わりに、あなたは正しい@DmitryEgorovメモリ –

答えて

2

使用File.ReadLines

foreach (var line in File.ReadLines("file path")) 
{ 
    if (line.EndsWith(myWord)) 
    { 
     outputEmails.Text += line + Environment.NewLine; 
    } 
} 

内部的にはそうあなたがそれを読む前にファイル全体をメモリにロードしないStreamReaderを使用しています。


memory mapped filesでさらに優れたパフォーマンスを達成できます。これにより、ファイルの内容を読み込むときに余分なメモリコピー操作が節約されます。

string line; 
var stringBuilder = new StringBuilder(); 
using (var memoryMappedFile = System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile(@"D:\Temp\test.txt")) 
using (var viewStream = memoryMappedFile.CreateViewStream()) 
using (var streamReader = new StreamReader(viewStream)) 
{ 
    while ((line = streamReader.ReadLine()) != null) 
     if (line.EndsWith(myWord)) 
      stringBuilder.AppendLine(line); 
} 
outputEmails.Text = stringBuilder.ToString(); 

そして、はい、他の回答には、生の文字列連結に代わりStringBuilderを使用して、言うようにも多くの行がフィルタ条件に一致する場合は特に、高速なコードを作成します。

1

もしあなたが何かを最適化したいなら、ベンチマークを使うべきです。 しかし、それはより速く動作するはずです:ここ

 string line; 
     var result = new StringBuilder(); 
     using (var reader = new StreamReader(fileName)) 
     { 
      while ((line = reader.ReadLine()) != null) 
      { 
       if (line.EndsWith(myWord)) 
        result.AppendLine(line); 
      } 
     } 
     outputEmails.Text = result.ToString(); 

利点:

1)使用StreamReaderを時間内のラインの代わりに、すべてのものによってファイルの行で読み取るためです。この場合、メモリ消費量を減らすことができます。さらに、ReadLineAsyncを使用してコードを非同期にすることもできます。

2)StringBuilderを使用すると、各連結で文字列の新しいインスタンスを作成することはありません。

これが役に立ちます。

1

最速の方法と最も最適化された方法は、StringBuilder

StringBuilder builder = new StringBuilder(); 
using (StreamReader reader = new StreamReader(@"c:\email.txt")) 
{ 
    while (!reader.EndOfStream) 
    { 
     var line = reader.ReadLine(); 
     if (line.EndsWith(myWord)) 
     { 
      builder.AppendLine(line); 
     } 
    } 
} 
outputEmails.Text = builder.ToString(); 
+0

にファイル全体を読み込む、気づかためのおかげでStreamReaderです。コードを編集します。 – Nino

関連する問題