检查字符串是否存在于大量文件中的最快方法

时间:2010-02-15 18:30:45

标签: c# regex performance

我目前正在迭代7000到10000个文本定义,大小在0到5000个字符之间变化,我想检查其中任何一个字符串是否存在。我想在5000个不同字符串定义的区域内进行此操作。

在大多数情况下,我只是想知道一个确切的不区分大小写的匹配,但有时需要正则表达式更具体。我想知道在不需要正则表达式的情况下使用另一种“搜索”技术是否会更快。

代码的细长版本看起来像这样。

foreach (string find in stringsiWantToFind)
{
    Regex rx = new Regex(find, RegexOptions.IgnoreCase);
    foreach (String s in listOfText)
        if (rx.IsMatch(s))
            find.FoundIn(s);
}

我已经阅读了一下,看看我是否遗漏了任何明显的东西。关于使用Compliled正则表达式有很多建议,但鉴于正则表达式的“动态”特性,我看不出这是有用的。

我还在CodeProject上阅读了一个有趣的article,所以我只是想看一下使用“FastIndexOf”来看看它在性能上的比较。

我只是想知道是否有人对此类问题有任何建议以及如何优化性能?

由于

3 个答案:

答案 0 :(得分:1)

这样的东西?创建一个包含要匹配的所有字符串的正则表达式,然后使用该正则表达式遍历文件。 new Regex参数错误,我对.net正则表达式模式的了解并不是最好的。此外,我遗漏了一些using,以使其更具可读性。如果这可以改进,你可以编译Regex

Regex rx = new Regex("string1|string2|string3|string5|string-etc", RegexOptions.IgnoreCase);

foreach (string fileName in fileNames)
{
  var fs = new FileStream(fileName.ToString(), FileMode.Open,  FileAccess.ReadWrite, FileShare.ReadWrite);    
  var sr = new StreamReader(fs);    
  var sw = new StreamWriter(fs);

  string readFile = sr.ReadToEnd();
  MatchCollection matches = rx.Matches(readFile );

  foreach (Match match in matches)
  {
    //do stuff
  }
}

答案 1 :(得分:0)

我会查看文件索引服务,例如MS Indexing ServiceGoogle Desktop Search。这些API将允许您搜索文件的索引而不是文件本身,并且非常快。

答案 2 :(得分:-1)

我想到的一个诀窍是:

将字符串连接成1个大字符串,让正则表达式在全局级别上运行。这样可以使用1个正则表达式而不是在列表上循环,从而得到xx times'的结果。

希望这有帮助,