c#如何快速浏览~300mb日志文件

Ted*_*ddy 3 c# arrays grep file

我试图在c#中读取一个巨大的日志文件 - 大约300mb的原始文本数据.我已经在大约1mb的较小文件上测试我的程序,它将所有日志消息存储到string []数组中并使用contains进行搜索.

然而,这太慢,占用太多内存,我永远无法处理300mb日志文件.我需要一种方法来grep文件,它快速过滤它找到有用的数据并打印对应于搜索的日志信息行.

最大的问题是规模,我认为300mb将是我的最大值,但需要我的程序来处理它.我可以使用哪些功能,数据结构,搜索,可以快速和高效地扩展,以读取大的日志文件

Sum*_*umo 7

File.ReadLines可能是你最好的选择,因为它会为你提供IEnumerable一行文本文件并在你迭代时懒洋洋地读取它们IEnumerable.然后,您可以使用任何方法搜索你想使用的线(Regex,Contains,等),并用它做什么.下面我的例子产生一个线程来搜索该行并将其输出到控制台,但你可以做任何事情.当然,TEST,TEST,TEST在大文件上看你的性能里程.我想如果下面生成的每个单独的线程花费的时间太长,你可以遇到一个线程限制.

IEnumerable<string> lines = File.ReadLines("myLargeFile.txt");
foreach (string line in lines) {
    string lineInt = line;
    (new Thread(() => {
        if (lineInt.Contains(keyword)) {
            Console.WriteLine(lineInt);
        }
    })).Start();
}
Run Code Online (Sandbox Code Playgroud)

编辑:通过我自己的测试,这显然更快:

foreach (string lineInt in File.ReadLines("myLargeFile.txt").Where(lineInt => lineInt.Contains(keyword))) {
    Console.WriteLine(lineInt);
}
Run Code Online (Sandbox Code Playgroud)

  • @JonathanHenson如果您实现自己的IO,那可能是真的.在这种情况下,您只是在System.IO中使用.NET 4框架的一个功能,它为您提供了一种使用几乎任何大小的文件的简单方法.它的表现只能通过测试来证明. (2认同)