c# - 我什么时候应该读一个文件,什么时候应该逐行阅读?

标签 c# performance filestream

假设我有一个编辑文本文件的 C# 应用程序。每个文件采用的技术可以是:

1) 立即将文件读入字符串,进行更改,然后将字符串写入现有文件:

string fileContents = File.ReadAllText(fileName);

// make changes to fileContents here...

using (StreamWriter writer = new StreamWriter(fileName))
{
    writer.Write(fileContents);
}

2) 逐行读取文件,将更改写入临时文件,然后删除源代码并重命名临时文件:

using (StreamReader reader = new StreamReader(fileName))
{
    string line;

    using (StreamWriter writer = new StreamWriter(fileName + ".tmp"))
    {
        while (!reader.EndOfStream)
        {
            line = reader.ReadLine();
            // make changes to line here
            writer.WriteLine(line);
        }
    }
}
File.Delete(fileName);
File.Move(fileName + ".tmp", fileName);

这些选项的性能注意事项是什么?

在我看来,无论是按行读取还是一次读取整个文件,都会读取相同数量的数据,磁盘时间将主导内存分配时间。也就是说,一旦一个文件在内存中,操作系统就可以自由地将它调出页面,而当它这样做时,大读取的好处就失去了。另一方面,当使用临时文件时,句柄关闭后我需要删除旧文件并重命名临时文件,这会产生成本。

然后是关于缓存、预取和磁盘缓冲区大小的问题......

我假设在某些情况下,读取文件更好,而在其他情况下,按行操作更好。我的问题是,这两个案例的条件是什么?

最佳答案

in some cases, slurping the file is better, and in others, operating by line is better.

非常接近;除了逐行阅读实际上是一个更具体的案例。我们想要区分的实际选择是 ReadAll 和使用缓冲区。 ReadLine 做出假设 - 最大的假设是文件实际上有行,并且它们的长度合理!如果我们不能对文件做出这种假设,我们希望选择一个特定的缓冲区大小并读入它,而不管我们是否已经到达一行的末尾。

因此,在一次读取所有内容和使用缓冲区之间做出决定 - 始终选择最容易实现、最简单的方法,直到你遇到特定不适合你的情况 - 并且有了具体案例,您可以根据实际掌握的信息做出明智的决定,而不是推测假设情况。

最简单 - 一次阅读所有内容。

性能是否成为问题?此应用程序是否针对不受控制的文件运行,因此它们的大小不可预测?只是几个您想分块的示例。

关于c# - 我什么时候应该读一个文件,什么时候应该逐行阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3295681/

上一篇:c# - 组合方法

下一篇:c# - 顶层异常

相关文章:

c# - 如何找到包含程序集的 nuget 包?

c# - Visual Studio xaml 设计器未加载

java - Jetty 8 中的默认配置是否适合负载相当重的 Web 应用程序?

javascript - 在 JavaScript 中声明多个变量

java - 如何实现快速的OpenCV均匀性检测图像处理算法?

javascript - 使用 csv-parse 和 Node 在读取和解析文件中添加快速随机访问

sql-server - 由于数据存储仅支持本地路径,如何使用文件流管理大量数据?

c# - 发送完整的数据表还是先使用.Select?

sql-server - SQL Server 2008 中存储文档的最佳策略

c# - 如何在 Documentdb 中创建一个自动递增的列