我目前正在使用这样的代码构造:
string line;
using (System.IO.StreamReader file = new System.IO.StreamReader("somelargefile.txt"))
{
while ((line = file.ReadLine()) != null)
// do something
}
我用它来读取一个非常大的文本文件。 (我需要逐行评估,有些行需要存储在内存中)。我觉得很奇怪,这段代码不会导致性能损失。我假设每次ReadLine
调用都会导致访问磁盘,使我的程序在数百兆字节的文件上速度极慢。但它实际上似乎很快。这是为什么?
ReadLine和物理磁盘访问之间没有关系吗?
答案 0 :(得分:3)
StreamReader
,我相信它的父类TextReader
使用缓冲读取。系统首先读取原始数据块。您可以使用DiscardBuffer()
StreamReader
方法手动清空此缓冲区,但我不知道如何访问它。
MSDN具有详细的explanation原则。
答案 1 :(得分:2)
所需信息由您的进程逐行读取,但操作系统将通过将文件映射到内存来访问该文件。因此,当您在同一内存页面中读取一行时,访问速度非常快。当页面在内存中不可用且存在页面错误时,将存在磁盘访问。那个时候操作系统会检查一些不需要的页面并将所需的页面加载到内存中。通读操作系统中的分页和内存访问。