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

c#如何快速浏览~300mb的日志文件,c#,arrays,file,grep,C#,Arrays,File,Grep,我正试图用c语言读取一个日志文件,这个文件很大,大约有300MB的原始文本数据。我一直在用大约1mb的较小文件测试我的程序,这些文件将所有日志消息存储到字符串[]数组中,并使用contains进行搜索 然而,这太慢,占用太多内存,我将永远无法处理300mb的日志文件。我需要一种对文件进行grep的方法,该方法可以快速过滤文件,找到有用的数据并打印与搜索对应的日志信息行 最大的问题是规模,我认为300mb将是我的最大容量,但需要我的程序来处理。我可以使用哪些函数、数据指令和搜索来快速高效地读取这么

我正试图用c语言读取一个日志文件,这个文件很大,大约有300MB的原始文本数据。我一直在用大约1mb的较小文件测试我的程序,这些文件将所有日志消息存储到字符串[]数组中,并使用contains进行搜索

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

最大的问题是规模,我认为300mb将是我的最大容量,但需要我的程序来处理。我可以使用哪些函数、数据指令和搜索来快速高效地读取这么大的日志文件,这可能是您最好的选择,因为它可以为您提供文本文件的
IEnumerable
,并在您迭代
IEnumerable
时懒洋洋地读取它们。然后,您可以使用任何方法来搜索您想要使用的行(
Regex
Contains
,等等),并对其进行处理。我下面的示例生成一个线程来搜索行并将其输出到控制台,但是您可以做任何事情。当然,测试,测试,测试大文件,看看你的性能里程。我想,如果下面生成的每个线程花费的时间太长,您可能会遇到线程限制

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

我相信会有办法更快地运行grep,但是在您这样做之前,您是否能够在grep之前使用更快的字符串比较检查来预过滤日志?您是在使用grep还是正在编写程序来这样做?您可以考虑逐行处理,而不是读取整个文件。一个更复杂但与行长无关的操作是,您一次读取一定数量的字符并对其进行处理(不过实现起来很复杂)。如果您可以使用.NET 4,请参阅推荐的StreamReader或MemoryMappedFile。您是否测量了大部分时间所用的时间?它正在读文件吗?搜索?垃圾收集?日志文件太大了,我想读取文件,搜索我要找的标签。我想在点击时显示并忽略其他内容。我将它们存储在列表框视图(数组)中。我必须找到一种更好的方法将信息写入c#,它不会占用太多内存,因为我认为listbox本质上是arraySumo,所以File.ReadLines()不会一次将整个文件读入内存?不,它只是给你一个迭代器,当你迭代IEnumerable时,它会从文件中产生一行。是的,我想我的大问题是把它们都放在数组中,甚至在我不需要的时候都放在内存中。我只想能够搜索我想要的,然后将重要信息存储在memory@JonathanHenson如果您正在实现自己的IO,那么这可能是正确的。在本例中,您只需在System.IO中使用.NET 4 framework的一项功能,它为您提供了一种处理几乎任何大小文件的简单方法。只有通过测试才能证明它的性能。特别是用于测试和测量。显然,每行显示一个线程是为了纯粹的娱乐,实际上创建多个线程(特别是这里无限数量的线程)会降低几乎任何任务的性能。
foreach (string lineInt in File.ReadLines("myLargeFile.txt").Where(lineInt => lineInt.Contains(keyword))) {
    Console.WriteLine(lineInt);
}