这与我之前的一个问题有切线关系。
本质上,该问题的解决方案效果很好,但现在我需要对其进行调整以在更大的分析应用程序中工作。简单地使用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())
会严重破坏内存,我只知道。