我需要处理一个大文件,大约400K行和200M.但有时我必须自下而上处理.我怎样才能在这里使用迭代器(yield return)?基本上我不喜欢在内存中加载所有内容.我知道在.NET中使用迭代器更有效.
显示非常大的文本文件的最后10行的最有效方法是什么(此特定文件超过10GB).我只想写一个简单的C#应用程序,但我不确定如何有效地做到这一点.
需要一段代码来读出日志文件的最后"n行".我从网上得到了以下代码.我是C sharp的新手.由于日志文件可能非常大,我想避免读取整个文件的开销.有人建议任何性能增强.我真的不想读每个角色并改变位置.
var reader = new StreamReader(filePath, Encoding.ASCII);
reader.BaseStream.Seek(0, SeekOrigin.End);
var count = 0;
while (count <= tailCount)
{
if (reader.BaseStream.Position <= 0) break;
reader.BaseStream.Position--;
int c = reader.Read();
if (reader.BaseStream.Position <= 0) break;
reader.BaseStream.Position--;
if (c == '\n')
{
++count;
}
}
var str = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud) 在这个答案的推动下,我想知道如果一个人使用了很多东西,幕后会发生什么FileStream.Seek(-1).
为清楚起见,我将重新发布答案:
using (var fs = File.OpenRead(filePath))
{
fs.Seek(0, SeekOrigin.End);
int newLines = 0;
while (newLines < 3)
{
fs.Seek(-1, SeekOrigin.Current);
newLines += fs.ReadByte() == 13 ? 1 : 0; // look for \r
fs.Seek(-1, SeekOrigin.Current);
}
byte[] data = new byte[fs.Length - fs.Position];
fs.Read(data, 0, data.Length);
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会将2048个字节读入缓冲区并在该缓冲区中搜索char.
使用Reflector我发现该方法在内部使用SetFilePointer.
有没有关于Windows缓存和向后读取文件的文档?Windows是否"向后"缓冲并在使用连续时查询缓冲区Seek(-1)还是从当前位置开始提前读取?
有趣的是,一方面大多数人都同意Windows进行良好的缓存,但另一方面,"向后读取文件"的每个答案都涉及读取字节块并对该块进行操作.