c# 如何快速通过 ~300mb 日志文件进行 grep

标签 c# arrays file grep

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

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

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

最佳答案

File.ReadLines这可能是您最好的选择,因为它为您提供文本文件行的 IEnumerable 并在您遍历 IEnumerable 时懒惰地读取它们。然后,您可以使用任何方法来搜索您想要使用的行(RegexContains 等)并对其执行一些操作。我下面的示例生成一个线程来搜索该行并将其输出到控制台,但您几乎可以做任何事情。当然,对大文件进行测试、测试、测试以查看您的性能里程。我想如果下面生成的每个线程都花费太长时间,您可能会遇到线程限制。

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);
}

关于c# 如何快速通过 ~300mb 日志文件进行 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12739204/

相关文章:

c# - 如果使用 Razor MVC3 在 div 标记内声明

c# - 更改存储帐户连接字符串后,Azure Function App 无法工作

c# - 如何在 C# 打开文件之前检测损坏的文件

java - 在java中使用hashmap创建嵌套映射来完成嵌套数组但不起作用

javascript - 始终删除文件路径的特定部分?

c - 在 C 中以尽可能短的方式(并且无麻烦的方式)读取整个文件内容

c# - Web API POST MultipartFormDataContent : Can response return multipartform content?

javascript - 在 JavaScript 数组中显示对象

qt - 如何在Qt中创建一个具有完整路径的新文件?

file - 批处理文件不运行 - 它们是用记事本打开的