我有30个文本文件(比如日志文件),这些文件的大小从100MB到200MB不等,我还有一个文本文件(Pattern.txt),其中包含大约30个正则表达式模式。我需要以快速有效的方式将所有正则表达式模式与日志文件中的每一行进行比较。目前我正在从日志文件中逐行阅读并将其与所有模式进行比较。
在不使用第三方组件的情况下,是否有更有效的方法来实现这一目标?
答案 0 :(得分:1)
当过滤不使用正则表达式时,即如果你需要将行N与30个正则表达式进行比较,请尝试将这些正则表达式转换为字符串index time: 3492 ms
regex time: 81553 ms
运算,即如果是这样的话,那么我们将比较正则表达式。基本的字符串比较函数非常快,如果使用正则表达式的性能是一个问题,首先使用普通的字符串比较函数来加快速度。以下示例有点人为,但它表明使用正则表达式进行过滤比使用正则表达式快得多。
Value="Path=/this/is/a/path" InitString="Path = " EndString="," />
<Pattern Value="Path=/this/is/a/path" InitString="Path = " EndString="," />
我创建了一个70Mb交替行的文件,即
Pattern
通过查找字符串private void indexOf(StreamReader streamReader) {
String line;
string pat = @".*Pattern.*";
Regex r = new Regex(pat);
while ((line = streamReader.ReadLine ()) != null) {
if(line.IndexOf("Pattern") > 0) {
if(r.Match(line).Success) {
this.line_count++;
}
}
}
}
private void regex(StreamReader streamReader) {
String line;
string pat = @".*Pattern.*";
Regex r = new Regex(pat);
while ((line = streamReader.ReadLine ()) != null) {
if(r.Match(line).Success) {
this.line_count++;
}
}
}
来迭代这些行。使用indexOf来过滤行的函数对于这个用例来说要快23倍(我不是C#开发人员,因此其中一些可能不是惯用的。)
@Resource
您需要以可以在使用正则表达式之前首先过滤的方式编写应用程序。