我有一个 1GB 文件,每行包含 1 个字符串。
我必须读取前 100MB,这样如果边界落在字符串的中间,则最后一行的整个内容都会包含在结果中。
在 C# 中实现此目的的最佳方法是什么?
最佳答案
一种选择是使用 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
中,然后继续阅读(并转换为文本)直到找到下一个换行符,然后附加最后的部分-line 数据到 MemoryStream
并最终在 MemoryStream
周围创建一个 StreamReader
,但这又相当繁琐。
另一种选择是创建某种“长度限制”流包装器,您可以将限制设置得足够大以明确包含最后一行 - 同样,这可能会有些过度读取。
关于c# - 如何从大文件中读取特定量的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393796/