我有一个1GB的文件,每行包含1个字符串。
我必须读取前100MB,如果边界位于字符串的中间,则整个最后一行都包含在结果中。
在C#中完成tis的最佳方法是什么?
答案 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;流包装器,你将限制设置得足够大,绝对包括最后一行 - 再次,这可能会有点过度,可能。