ReadLine如何在.NET中运行

ayd*_*man 0 c# memory memory-management

假设我有一个1 GB的文本文件,我想阅读它.如果我尝试打开此文件,我会收到"内存溢出"错误.我知道,通常的答案是"使用StreamReader.ReadLine()方法".但我想知道这是如何工作的.如果使用ReadLine方法的程序想要获取一行,则必须迟早打开整个文本文件.据我所知,文件存储在磁盘上,它们可以在"全有或全无"的原则下在内存中打开.如果我的1 GB文本文件中只有一行通过使用ReadLine()方法一次存储在内存中,这意味着我们必须在读取1 GB文本文件的每一行时使用磁盘IO.这对于表演来说这不是一件可怕的事情吗?

我很困惑,我想要一些有关这方面的细节.

Han*_*ant 5

这意味着我的1 GB文本文件的每一行都必须有磁盘IO

不,您的ReadLine()调用和物理磁盘之间有很多层,旨在解决这个问题.最重要的:

  • FileStream是为StreamReader完成工作的基础类,它使用缓冲区来减少ReadFile()调用的数量.默认大小为4096字节
  • ReadFile()从文件系统缓存中读取文件数据,而不是磁盘.这可能会导致对磁盘驱动程序的调用,但这并不常见.操作系统非常智能,可以猜测您可能会从文件中读取更多数据并从磁盘预先读取数据,只要这样做便宜并且RAM不用于其他任何事情.它通常会淹没整个磁盘柱的数据.
  • 磁盘驱动器本身也有一个缓存,通常是几兆字节.

文件系统缓存是迄今为止最重要的缓存.也是一个棘手的问题因为它阻止你准确地分析你的程序.当您一遍又一遍地运行测试时,您的程序实际上永远不会从磁盘读取,只读取缓存.这使得它变得不切实际.虽然1 GB文件可能不太适合,但取决于您在机器中有多少RAM.