假设我有一个编辑文本文件的 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/