ReadLine和磁盘访问之间的关系
本文关键字:关系 之间 访问 磁盘 ReadLine | 更新日期: 2023-09-27 17:58:43
我目前正在使用这样的代码构造:
string line;
using (System.IO.StreamReader file = new System.IO.StreamReader("somelargefile.txt"))
{
while ((line = file.ReadLine()) != null)
// do something
}
我用它来读取一个很大的文本文件。(我需要逐行评估,有些行需要存储在内存中)。我觉得奇怪的是,这段代码不会导致性能损失。我假设每次ReadLine
调用都会导致对磁盘的访问,从而使我的程序在数百兆字节大的文件上运行速度极慢。但实际上它看起来相当快。为什么会这样?
那么ReadLine和物理磁盘访问之间是否没有关系?
StreamReader
和它的父类TextReader
使用缓冲读取。系统首先读取一块原始数据。你可以使用StreamReader
的DiscardBuffer()
方法手动清空这个缓冲区,但我不知道访问它的方法
MSDN对这些原理有详细的解释。
所需信息由进程逐行读取,但操作系统将通过将文件映射到内存来访问该文件。因此,当你在同一个内存页中读取一行时,访问速度相当快。当内存中的页面不可用并且出现页面故障时,将进行磁盘访问。届时,操作系统将检查出一些不需要的页面,并将所需的页面加载到内存中。操作系统中的读通分页和内存访问。