これは、私の以前の質問に正直に関連しています。
基本的に、その質問のソリューションはうまく機能しましたが、今では、はるかに大規模な分析アプリケーションで機能するように適応させる必要があります。StreamReader.ReadToEnd()
私が読み込むファイルのいくつかは非常に大きいので、単に使用することは受け入れられません。間違いがあり、誰かがクリーンアップするのを忘れた場合、理論的にはギガバイトの大きさになる可能性があります。明らかに、私はその最後まで読むことはできません。
残念ながら、私が読み取っているデータの行の一部にはスタックトレースが含まれているため、通常の読み取り行も受け入れられません。これらは明らかに/r/n
フォーマットで使用されます。理想的には、正規表現に一致するまで先読みするようにプログラムに指示し、正規表現が返されるようにします。.netでこれを行う機能はありますか?そうでない場合は、それを書く方法についていくつかの提案を得ることができますか?
編集:私の質問に従うのを少し簡単にするために、ここに適応されたコードの重要な部分のいくつかのペーストがあります:
foreach (var fileString in logpath.Select(log => new StreamReader(log)).Select(fileStream => fileStream.ReadToEnd()))
{
const string junkPattern = @"\[(?<junk>[0-9]*)\] \((?<userid>.{0,32})\)";
const string severityPattern = @"INFO|ERROR|FATAL";
const string datePattern = "^(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})";
var records = Regex.Split(fileString, datePattern, RegexOptions.Multiline);
foreach (var record in records.Where(x => string.IsNullOrEmpty(x) == false))
......
問題はForeachにあります。 .Select(fileStream => fileStream.ReadToEnd())
記憶をひどく爆破するつもりです、私はそれを知っています。