3

C# でログ ファイルを読み込もうとしていますが、そのサイズは約 300 mbs の生のテキスト データです。すべてのログ メッセージを string[] 配列に格納し、contains で検索する、約 1 MB の小さなファイルでプログラムをテストしています。

ただし、これは遅すぎてメモリを大量に消費するため、300 MB のログ ファイルを処理することはできません。ファイルをgrepする方法が必要です。これにより、ファイルをすばやくフィルタリングして、有用なデータを見つけ、検索に対応するログ情報の行を出力します。

大きな問題はスケールです。300MB が最大になると思いますが、それを処理するにはプログラムが必要です。どのような関数、データ構造、検索を使用できますか

4

1 に答える 1

7

File.ReadLinesIEnumerableテキストファイルの行を提供し、 IEnumerable. 次に、使用したい行を検索するための任意の方法 ( 、 など) を使用RegexContainsて、それで何かを行うことができます。以下の例では、スレッドを生成して行を検索し、それをコンソールに出力しますが、ほぼ何でもできます。もちろん、テスト、テスト、大きなファイルでテストして、パフォーマンスのマイレージを確認してください。以下で生成された個々のスレッドに時間がかかりすぎると、スレッドの制限に達する可能性があると思います。

IEnumerable<string> lines = File.ReadLines("myLargeFile.txt");
foreach (string line in lines) {
    string lineInt = line;
    (new Thread(() => {
        if (lineInt.Contains(keyword)) {
            Console.WriteLine(lineInt);
        }
    })).Start();
}

編集:私自身のテストを通じて、これは明らかに高速です:

foreach (string lineInt in File.ReadLines("myLargeFile.txt").Where(lineInt => lineInt.Contains(keyword))) {
    Console.WriteLine(lineInt);
}
于 2012-10-05T04:16:46.153 に答える