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和物理磁盘访问之间是否没有关系?

ReadLine和磁盘访问之间的关系

StreamReader和它的父类TextReader使用缓冲读取。系统首先读取一块原始数据。你可以使用StreamReaderDiscardBuffer()方法手动清空这个缓冲区,但我不知道访问它的方法

MSDN对这些原理有详细的解释。

所需信息由进程逐行读取,但操作系统将通过将文件映射到内存来访问该文件。因此,当你在同一个内存页中读取一行时,访问速度相当快。当内存中的页面不可用并且出现页面故障时,将进行磁盘访问。届时,操作系统将检查出一些不需要的页面,并将所需的页面加载到内存中。操作系统中的读通分页和内存访问。