读取文本文件的最快方法是什么?

读取文本文件的最快方法是什么?

我想逐行读取文本文件。我想知道我是否在.NET C#范围内尽可能高效地完成这个任务。

这就是我目前正在尝试的:

var filestream = new System.IO.FileStream(textFilePath,
              System.IO.FileMode.Open,
              System.IO.FileAccess.Read,
              System.IO.FileShare.ReadWrite);var file = new System.IO.StreamReader(filestream, System.Text.Encoding.UTF8, true, 128);
              while ((lineOfText = file.ReadLine()) != null){
    //Do something with the lineOfText}


慕容3067478
浏览 828回答 3
3回答

开心每一天1111

要想找到最快的逐行读取文件的方法,您必须做一些基准测试。我在我的电脑上做了一些小测试,但你不能指望我的结果适用于你的环境。使用StreamReader.Readline这基本上是你的方法。由于某些原因,您将缓冲区大小设置为最小的可能值(128)。增加这一点通常会提高性能。默认大小是1,024,其他好的选择是512(Windows中的扇区大小)或4,096(NTFS中的集群大小)。您必须运行一个基准测试来确定最佳缓冲区大小。更大的缓冲区-如果不是更快-至少不会比较小的缓冲区慢。const&nbsp;Int32&nbsp;BufferSize&nbsp;=&nbsp;128;using&nbsp;(var&nbsp;fileStream&nbsp;=&nbsp;File.OpenRead(fileName)) &nbsp;&nbsp;using&nbsp;(var&nbsp;streamReader&nbsp;=&nbsp;new&nbsp;StreamReader(fileStream,&nbsp;Encoding.UTF8,&nbsp;true,&nbsp;BufferSize))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;streamReader.ReadLine())&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Process&nbsp;line &nbsp;&nbsp;}这个FileStream构造函数允许您指定文件选择..例如,如果您从头到尾依次读取一个大文件,则可以从FileOptions.SequentialScan..再一次,基准是你能做的最好的事情。使用File.Readline这非常类似于您自己的解决方案,只是它是使用StreamReader固定缓冲区大小为1,024。在我的计算机上,这与缓冲区大小为128的代码相比,性能略有提高。但是,通过使用更大的缓冲区大小,您可以获得相同的性能提升。此方法使用迭代器块实现,不占用所有行的内存。var&nbsp;lines&nbsp;=&nbsp;File.ReadLines(fileName);foreach&nbsp;(var&nbsp;line&nbsp;in&nbsp;lines) &nbsp;&nbsp;//&nbsp;Process&nbsp;line使用File.ReadAllline这与前面的方法非常相似,只是该方法会生成用于创建返回的行数组的字符串列表,因此内存需求更高。但是,它会返回String[]而不是IEnumerable<String>允许你随机进入线路。var&nbsp;lines&nbsp;=&nbsp;File.ReadAllLines(fileName);for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;lines.Length;&nbsp;i&nbsp;+=&nbsp;1)&nbsp;{ &nbsp;&nbsp;var&nbsp;line&nbsp;=&nbsp;lines[i]; &nbsp;&nbsp;//&nbsp;Process&nbsp;line}使用String.plit这种方法要慢得多,至少在大文件上(在511 KB文件上进行了测试),这可能是由于String.Split已实现。它还为所有行分配一个数组,与解决方案相比,增加了所需的内存。using&nbsp;(var&nbsp;streamReader&nbsp;=&nbsp;File.OpenText(fileName))&nbsp;{ &nbsp;&nbsp;var&nbsp;lines&nbsp;=&nbsp;streamReader.ReadToEnd().Split("\r\n".ToCharArray(),&nbsp;StringSplitOptions.RemoveEmptyEntries); &nbsp;&nbsp;foreach&nbsp;(var&nbsp;line&nbsp;in&nbsp;lines) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Process&nbsp;line}我的建议是使用File.ReadLines因为它干净高效。如果需要特殊的共享选项(例如,使用FileShare.ReadWrite),您可以使用自己的代码,但应该增加缓冲区大小。
打开App,查看更多内容
随时随地看视频慕课网APP