如何从大文件中读取特定数量的数据

时间:2013-12-05 07:19:15

标签: c#

我有一个1GB的文件,每行包含1个字符串。

我必须读取前100MB,如果边界位于字符串的中间,则整个最后一行都包含在结果中。

在C#中完成tis的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

一种选择是使用StreamReader来读取行,但检查基础流上的Position

List<string> lines = new List<string>();
using (var reader = File.OpenText("file.txt"))
{
    string line;
    while (reader.BaseStream.Position < DataLimit &&
           (line = reader.ReadLine()) != null)
    {
        lines.Add(line);
    }
}

这里有两个问题:

  • StreamReader可能会缓冲数据,因此Stream实际上会比您读过的数据更进一步。为了应对这种情况,你需要为你的限制添加一些额外的缓冲区,即使这样,它仍然不会非常精确。
  • 在每一行上调用Position可能会显着降低速度。

另一种方法是将尽可能多的数据复制到MemoryStream,然后继续阅读(并转换为文本),直到找到下一个换行符,然后附加最后的部分行数据到了MemoryStream并最终在StreamReader周围创建了MemoryStream,但这又是非常繁琐的。

另一种选择是创造某种长度限制&#34;流包装器,你将限制设置得足够大,绝对包括最后一行 - 再次,这可能会有点过度,可能。