相关疑难解决方法(0)

如何在C#中使用迭代器反向读取文本文件

我需要处理一个大文件,大约400K行和200M.但有时我必须自下而上处理.我怎样才能在这里使用迭代器(yield return)?基本上我不喜欢在内存中加载所有内容.我知道在.NET中使用迭代器更有效.

.net c#

84
推荐指数
3
解决办法
5万
查看次数

获取最后10行非常大的文本文件> 10GB

显示非常大的文本文件的最后10行的最有效方法是什么(此特定文件超过10GB).我只想写一个简单的C#应用​​程序,但我不确定如何有效地做到这一点.

c# text large-files

64
推荐指数
6
解决办法
5万
查看次数

如何读取日志文件的最后"n"行

需要一段代码来读出日志文件的最后"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)

.net c# performance file-io

16
推荐指数
1
解决办法
2万
查看次数

FileStream.Seek与缓冲读取

这个答案的推动下,我想知道如果一个人使用了很多东西,幕后会发生什么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进行良好的缓存,但另一方面,"向后读取文件"的每个答案都涉及读取字节块并对该块进行操作.

c# file-io

5
推荐指数
1
解决办法
2921
查看次数

标签 统计

c# ×4

.net ×2

file-io ×2

large-files ×1

performance ×1

text ×1