C# 在大型文本文件中快速搜索
我正在尝试用C语言编写一个搜索程序,它将在一个大文本文件(5GB)中搜索字符串。我已经完成了如下所示的简单代码,但搜索结果非常耗时,可能需要大约30分钟才能完成。这就是我的代码的样子-C# 在大型文本文件中快速搜索,c#,.net,full-text-search,C#,.net,Full Text Search,我正在尝试用C语言编写一个搜索程序,它将在一个大文本文件(5GB)中搜索字符串。我已经完成了如下所示的简单代码,但搜索结果非常耗时,可能需要大约30分钟才能完成。这就是我的代码的样子- 公共列表搜索(字符串搜索键) { 列表结果=新列表(); StreamReader fileReader=新的StreamReader(“D:\Logs.txt”); 而((line=fileReader.ReadLine())!=null) { 如果(行包含)(搜索键) { 结果:添加(行); } } } 虽
公共列表搜索(字符串搜索键)
{
列表结果=新列表();
StreamReader fileReader=新的StreamReader(“D:\Logs.txt”);
而((line=fileReader.ReadLine())!=null)
{
如果(行包含)(搜索键)
{
结果:添加(行);
}
}
}
虽然代码工作正常,但运行速度非常慢,大约需要30分钟才能完成。我们可以做些什么,将搜索时间缩短到一分钟以下吗?对于一个非常大的文件中的字符串搜索,可以使用Boyer Moore搜索算法,这是实用字符串搜索文献的标准基准。对于它的实现,链接是文如下:
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