3

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

但是这太慢并且占用太多内存,我将永远无法处理 300mb 的日志文件。我需要一种 gr​​ep 文件的方法,它可以快速过滤它以找到有用的数据并打印与搜索相对应的日志信息行。

最大的问题是规模,我认为 300mb 将是我的最大值,但需要我的程序来处理它。我可以使用哪些函数、数据结构、搜索来以速度和效率很好地扩展来读取这么大的日志文件

4

1 回答 1

7

File.ReadLines可能是您最好的选择,因为它为您提供IEnumerable文本文件的一行,并在您遍历IEnumerable. 然后,您可以使用任何方法来搜索您想要使用的行(RegexContains等)并对其进行处理。我下面的示例生成了一个线程来搜索该行并将其输出到控制台,但您几乎可以做任何事情。当然,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();
}

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

foreach (string lineInt in File.ReadLines("myLargeFile.txt").Where(lineInt => lineInt.Contains(keyword))) {
    Console.WriteLine(lineInt);
}
于 2012-10-05T04:16:46.153 回答