Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找文件中文本的最快方法_C#_.net_String_File - Fatal编程技术网

C# 查找文件中文本的最快方法

C# 查找文件中文本的最快方法,c#,.net,string,file,C#,.net,String,File,所以我在寻找一种有效搜索文件中文本的方法。现在我用的是: using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024, FileOptions.SequentialScan)) using (StreamReader streamReader = new StreamReader(fileStream)) { stri

所以我在寻找一种有效搜索文件中文本的方法。现在我用的是:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024, FileOptions.SequentialScan))
using (StreamReader streamReader = new StreamReader(fileStream))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        int index = 0;
        while ((index = line.IndexOf(searchText, index, StringComparison.Ordinal)) != -1)
        {
            index += searchText.Length;
        }
    }
}
但是,我想知道是否有一种更有效地搜索文件的方法。我想在缓冲区中搜索文本,但我不确定如何搜索。 谢谢

编辑: 不调用IndexOf,我可以得到大约1600ms。指数为,约为7400毫秒

编辑: 我有一个区块读取的基本实现,它将时间缩短到740ms。(无阅读行)
它还有很多工作要做,但我基本上是一次读取一个块,并对其进行索引。

从性能角度来看,您的方法将是O(xl)时间,其中x是正在搜索的字符串的长度,l是您尝试查找的字符串的长度。 您可以应用以下几种通用算法:

  • 博耶摩尔
  • 莫里斯·普拉特
  • 克努斯·莫里斯·普拉特

我建议您使用Boyer Moore,这里有一些关于如何实现它的示例:

这取决于瓶颈是什么,如果是文件读取,那么除了调整缓冲区大小之外,您不会更快。有帮助吗?@General I increment index,因为我想找到该字符串中的所有匹配项。内存映射文件与否,您的文件读取速度可能会比实际搜索速度慢(如果我猜一下的话)@VS-ux,您不会在这里得到答案,即使有人能找到一个好的答案,它可能会更快或更慢,这取决于特定的文件读取速度,以及您是否要按行执行(以及其他考虑因素)。此外,还有一些变量,如cpu速度和hdd速度,它们将在等式中发挥作用。如果我是你(我相信你是有能力的),只要坚持标杆,你就会找到最好的解决方案。(注意,我删除了大部分注释,因为这已经失控了)我在许多测试中看到IndexOf实际上仍然比当前的String实现快。IndexOf(String)使用一个简单的循环来检查某些给定文本的子字符串是否与模式匹配。虽然这个实现简单易懂,但效率很低,因为它必须遍历文本的最少m-n+1个字符,其中m是文本的长度,n是模式字符串的长度。然而,在许多类似的测试中:IndexOf的性能优于boyerI测试的boyer-moore(有利于boyer),但是,它仍然丢失了近一半。boyer-moore被证明是最快的算法之一。我不知道您现在的代码实现是什么,在什么环境下,但从理论角度来看,Boyer Moore是最好的方法。