为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2019-06-21 17:22:55
读取文本文件的最快方法是什么?我想逐行读取文本文件。我想知道我是否在.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}
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

要想找到最快的逐行读取文件的方法,您必须做一些基准测试。我在我的电脑上做了一些小测试,但你不能指望我的结果适用于你的环境。

使用StreamReader.Readline

这基本上是你的方法。由于某些原因,您将缓冲区大小设置为最小的可能值(128)。增加这一点通常会提高性能。默认大小是1,024,其他好的选择是512(Windows中的扇区大小)或4,096(NTFS中的集群大小)。您必须运行一个基准测试来确定最佳缓冲区大小。更大的缓冲区-如果不是更快-至少不会比较小的缓冲区慢。

const Int32 BufferSize = 128;using (var fileStream = File.OpenRead(fileName))
  using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
    String line;
    while ((line = streamReader.ReadLine()) != null)
      // Process line
  }

这个FileStream构造函数允许您指定文件选择..例如,如果您从头到尾依次读取一个大文件,则可以从FileOptions.SequentialScan..再一次,基准是你能做的最好的事情。

使用File.Readline

这非常类似于您自己的解决方案,只是它是使用StreamReader固定缓冲区大小为1,024。在我的计算机上,这与缓冲区大小为128的代码相比,性能略有提高。但是,通过使用更大的缓冲区大小,您可以获得相同的性能提升。此方法使用迭代器块实现,不占用所有行的内存。

var lines = File.ReadLines(fileName);foreach (var line in lines)
  // Process line

使用File.ReadAllline

这与前面的方法非常相似,只是该方法会生成用于创建返回的行数组的字符串列表,因此内存需求更高。但是,它会返回String[]而不是IEnumerable<String>允许你随机进入线路。

var lines = File.ReadAllLines(fileName);for (var i = 0; i < lines.Length; i += 1) {
  var line = lines[i];
  // Process line}

使用String.plit

这种方法要慢得多,至少在大文件上(在511 KB文件上进行了测试),这可能是由于String.Split已实现。它还为所有行分配一个数组,与解决方案相比,增加了所需的内存。

using (var streamReader = File.OpenText(fileName)) {
  var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  foreach (var line in lines)
    // Process line}

我的建议是使用File.ReadLines因为它干净高效。如果需要特殊的共享选项(例如,使用FileShare.ReadWrite),您可以使用自己的代码,但应该增加缓冲区大小。


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 827 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信