C# 在大型文本文件中快速搜索

C# 在大型文本文件中快速搜索,c#,.net,full-text-search,C#,.net,Full Text Search,我正在尝试用C语言编写一个搜索程序,它将在一个大文本文件(5GB)中搜索字符串。我已经完成了如下所示的简单代码,但搜索结果非常耗时,可能需要大约30分钟才能完成。这就是我的代码的样子- 公共列表搜索(字符串搜索键) { 列表结果=新列表(); StreamReader fileReader=新的StreamReader(“D:\Logs.txt”); 而((line=fileReader.ReadLine())!=null) { 如果(行包含)(搜索键) { 结果:添加(行); } } } 虽

我正在尝试用C语言编写一个搜索程序,它将在一个大文本文件(5GB)中搜索字符串。我已经完成了如下所示的简单代码,但搜索结果非常耗时,可能需要大约30分钟才能完成。这就是我的代码的样子-

公共列表搜索(字符串搜索键)
{
列表结果=新列表();
StreamReader fileReader=新的StreamReader(“D:\Logs.txt”);
而((line=fileReader.ReadLine())!=null)
{
如果(行包含)(搜索键)
{
结果:添加(行);
}
}
}

虽然代码工作正常,但运行速度非常慢,大约需要30分钟才能完成。我们可以做些什么,将搜索时间缩短到一分钟以下吗?

对于一个非常大的文件中的字符串搜索,可以使用Boyer Moore搜索算法,这是实用字符串搜索文献的标准基准。对于它的实现,链接是文如下:


对于超大文件中的字符串搜索,您可以使用Boyer-Moore搜索算法,这是实用字符串搜索文献的标准基准。对于其实现,链接如下:


文件索引在库Bsa.Search.Core中实现

您可以实现自己版本的文件读取。 FileByLinesRowReader—逐行读取文件并添加外部ID为相等行号的文档。 FileDocumentIndex已经在wiki数据json字典上进行了测试


文件索引在库Bsa.Search.Core中实现

您可以实现自己版本的文件读取。 FileByLinesRowReader—逐行读取文件并添加外部ID为相等行号的文档。 FileDocumentIndex已经在wiki数据json字典上进行了测试


这是否回答了您的问题?您是否只在一个文件中搜索一个字符串的所有匹配项?如果是,您似乎不太可能加快速度。但是,在一个5GB文件中搜索一个字符串的所有匹配项的30分钟似乎太多了。它是否通过网络连接运行?有多少行匹配?仅供参考,从语法上讲,您可以这样做代码更简洁:
var results=File.ReadLines(“D:\Logs.txt”).Where(line=>line.Contains(searchKey)).ToList();
@matthewatson-是的,我正在搜索一个文件,以查找一个字符串的所有匹配项。可以有0到50个匹配项,平均约5个。是的,我正在通过网络连接运行它。我建议只读取循环中的文件部分所需的时间(即注释掉
if(line.Contains(searchKey)){results.Add(行);}
part)。这会给你一个所用时间的下限。我猜你会发现几乎所有的时间都是从网络上读取的。这回答了你的问题吗?你只是在一个文件中搜索一个字符串的所有匹配项吗?如果是这样,你似乎不太可能加快速度。不过,在一个5GB文件中搜索所有匹配项需要30分钟或者一个字符串似乎太多了。它是通过网络连接运行的吗?有多少行匹配?仅供参考,从语法上讲,您可以使这段代码更简洁:
var results=File.ReadLines(“D:\Logs.txt”)。其中(line=>line.Contains(searchKey)).ToList();
@matthewatson-是的,我正在搜索一个文件,以查找一个字符串的所有匹配项。可以有0到50个匹配项,平均约5个。是的,我正在通过网络连接运行它。我建议只读取循环中的文件部分所需的时间(即注释掉
if(line.Contains(searchKey)){results.Add(line);}
part)。这会给你一个所用时间的下限。我猜你会发现几乎所有的时间都是从网络上读取的。我非常确定ReadLines+包含任何手工制作的beat算法。我非常确定ReadLines+包含任何手工制作的beat算法。
     var selector = new IndexWordSelector();
     var morphology = new DefaultMorphology(new WordDictionary(), selector);
     var fileName = "D:\Logs.txt";

     // you can implement your own file reader, csv, json, or other
     var index = new FileDocumentIndex(fileName, new FileByLinesRowReader(null), morphology);

     // if index is already exist we skip file indexing
         if (!index.IsIndexed)
     index.Start();
     while (!index.IsReady)
     {
         Thread.Sleep(300);
     }

     var query = "("one" | two) ~50 ("error*")".Parse("*");
     var found = index.Search(new SearchQueryRequest()
     {
         Field = "*",
         Query = query,
         ShowHighlight = true,
     });
     // where ExternalId is line number from file  
     //found.ShardResult.First().FoundDocs.FirstOrDefault().Value.ExternalId