Gigantor 提供了一个名为RegexSearcher
的工具,能够完成此任务。我使用了一份32GB的文件进行了测试,在我的MacBook Pro上只用了不到20秒。下面是相关代码:
Gigantor大幅提升了正则表达式的性能,并且适用于极大文件。你可以使用如下代码实现 Search
函数,利用Gigantor来提高效率。
public List<string> Search(string path, string searchKey)
{
System.Text.RegularExpressions.Regex regex = new(searchKey);
List<string> results = new List<string>();
System.Threading.AutoResetEvent progress = new(false);
Imagibee.Gigantor.RegexSearcher searcher = new(
path, regex, progress, maxMatchCount: 10000);
Imagibee.Gigantor.Background.StartAndWait(
searcher,
progress,
(_) => { },
1000);
if (searcher.Error.Length != 0) {
throw new Exception(searcher.Error);
}
using System.IO.FileStream fileStream = new(path, FileMode.Open);
Imagibee.Gigantor.StreamReader reader = new(fileStream);
foreach (var match in searcher.GetMatchData()) {
fileStream.Seek(match.StartFpos, SeekOrigin.Begin);
results.Add(reader.ReadLine());
}
return results;
}
这是测试代码。
[Test]
public void SearchTest()
{
var path = Path.Combine(Path.GetTempPath(), "enwik9x32");
Stopwatch stopwatch = new();
stopwatch.Start();
var results = Search(path, "unicorn");
stopwatch.Stop();
Console.WriteLine($"found {results.Count} results in {stopwatch.Elapsed.TotalSeconds} seconds");
}
这是控制台输出
found 8160 results in 19.1458573 seconds
这里是Gigantor 源代码库。我知道有点晚了,但希望这个答案对某人有所帮助。
var results = File.ReadLines("D:\Logs.txt").Where(line => line.Contains(searchKey)).ToList();
。 - maccetturaif(line.Contains(searchKey)){results.Add(line);}
部分注释掉)。这将为您提供时间下限。我猜想您会发现几乎所有时间都用于从网络读取。 - Matthew Watson