Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReadLine在.NET中的工作原理_C#_Memory_Memory Management - Fatal编程技术网

C# ReadLine在.NET中的工作原理

C# ReadLine在.NET中的工作原理,c#,memory,memory-management,C#,Memory,Memory Management,假设我有一个1GB的文本文件,我想读它。如果我试图打开这个文件,我会得到一个“内存溢出”错误。我知道,通常的答案是“使用StreamReader.ReadLine()方法”。但我想知道这是怎么回事。如果使用ReadLine方法的程序想要得到一行,它迟早要打开整个文本文件。据我所知,文件存储在磁盘上,可以按照“全有或全无”的原则在内存中打开。如果使用ReadLine()方法一次只在内存中存储一行1 GB文本文件,这意味着在读取1 GB文本文件时,我们必须为其每行存储I-O磁盘。这不是一件很糟糕的事

假设我有一个1GB的文本文件,我想读它。如果我试图打开这个文件,我会得到一个“内存溢出”错误。我知道,通常的答案是“使用StreamReader.ReadLine()方法”。但我想知道这是怎么回事。如果使用ReadLine方法的程序想要得到一行,它迟早要打开整个文本文件。据我所知,文件存储在磁盘上,可以按照“全有或全无”的原则在内存中打开。如果使用ReadLine()方法一次只在内存中存储一行1 GB文本文件,这意味着在读取1 GB文本文件时,我们必须为其每行存储I-O磁盘。这不是一件很糟糕的事情吗


我很困惑,我想了解一些细节。

通常在幕后打开一个
FileStream
对象,它从磁盘读取一大块文件并将其拉入内存。此块充当ReadLine()读取的
缓存
,因此您不必担心每个ReadLine()都会导致磁盘访问。

通常在后台打开一个
文件流
对象,该对象从磁盘读取一大块文件并将其拉入内存。此块充当ReadLine()读取的
缓存,因此您不必担心每个ReadLine()都会导致磁盘访问

这意味着我们必须为我的1GB文本文件的每一行发送I-O磁盘

不,在ReadLine()调用和物理磁盘之间有很多层,旨在避免出现问题。最重要的是:

  • FileStream是为StreamReader执行任务的底层类,它使用缓冲区来减少ReadFile()调用的数量。默认大小为4096字节
  • ReadFile()从文件系统缓存而不是磁盘读取文件数据。这可能会导致调用磁盘驱动程序,但这并不常见。操作系统足够聪明,可以猜测您可能会从文件中读取更多数据,并从磁盘中预读取数据,只要这样做成本低,并且RAM不用于其他任何用途。它通常会吞下整个磁盘柱面上的数据
  • 磁盘驱动器本身也有一个缓存,通常为数兆字节
到目前为止,文件系统缓存是最重要的。这也是一个棘手的问题,因为它会阻止您准确地分析您的程序。当您反复运行测试时,您的程序实际上从不从磁盘读取数据,只从缓存读取数据。这使得它的速度不切实际。尽管1GB文件可能不太合适,但这取决于计算机中有多少RAM

这意味着我们必须为我的1GB文本文件的每一行发送I-O磁盘

不,在ReadLine()调用和物理磁盘之间有很多层,旨在避免出现问题。最重要的是:

  • FileStream是为StreamReader执行任务的底层类,它使用缓冲区来减少ReadFile()调用的数量。默认大小为4096字节
  • ReadFile()从文件系统缓存而不是磁盘读取文件数据。这可能会导致调用磁盘驱动程序,但这并不常见。操作系统足够聪明,可以猜测您可能会从文件中读取更多数据,并从磁盘中预读取数据,只要这样做成本低,并且RAM不用于其他任何用途。它通常会吞下整个磁盘柱面上的数据
  • 磁盘驱动器本身也有一个缓存,通常为数兆字节

到目前为止,文件系统缓存是最重要的。这也是一个棘手的问题,因为它会阻止您准确地分析您的程序。当您反复运行测试时,您的程序实际上从不从磁盘读取数据,只从缓存读取数据。这使得它的速度不切实际。尽管1GB的文件可能不太合适,但这取决于机器中有多少RAM。

对什么性能来说最糟糕的事情是什么

显然,它应该更快,因为您有足够的内存来处理内存中的整个文件

但是,查找和分配连续块是一项成本

gig是一个重要的ram块,如果您的进程有它,有什么害处

交换可能比流媒体更容易造成伤害

你需要所有的文件同时,你需要它的所有时间

如果你去读/写。那会对你有什么影响

如果文件变成2 gig怎么办


您可以针对一个因素进行优化。在你这么做之前,你必须确保它是正确的,最重要的是你必须记住这是一台真正的机器。你的资源有限,所以优化总是徒劳无益。彼得可能会心烦意乱…

什么表演太糟糕了

显然,它应该更快,因为您有足够的内存来处理内存中的整个文件

但是,查找和分配连续块是一项成本

gig是一个重要的ram块,如果您的进程有它,有什么害处

交换可能比流媒体更容易造成伤害

你需要所有的文件同时,你需要它的所有时间

如果你去读/写。那会对你有什么影响

如果文件变成2 gig怎么办


您可以针对一个因素进行优化。在你这么做之前,你必须确保它是正确的,最重要的是你必须记住这是一台真正的机器。你的资源有限,所以优化总是徒劳无益。Peter可能会不高兴…

FYI,
ReadLine
不是C#的一部分-它是.NET.FYI的一部分,
ReadLine
不是C#的一部分-它是.NET的一部分。