有多少内存受到StreamReader的影响
本文关键字:StreamReader 影响 多少 内存 | 更新日期: 2023-09-27 18:09:35
当我像下面这样使用StreamReader时,有多少内存受到影响。我认为,因为每一行都被读入一个变量'line',只有那一行留在内存中,这是一件好事。我这样做的目的是,当我阅读一个非常非常大的包含数千行的文件时,不要给内存带来太多负担。
请澄清。string line = string.Empty;
using(StreamReader Reader = new StreamReader(@"C:'Users'UK'Panfile.txt"))
{
while((line = Reader.ReadLine())!= null)
{
//other code to process the line now being read.
}
Reader.Close(); Reader.Dispose();
}
StreamReader
将在调用之间使用byteBuffer.Length
的内存。如果没有指定默认值,则使用1024
字节。它还分配大小为encoding.GetMaxCharCount(bufferSize);
的char[] charBuffer
,为数组中的每个元素分配两个字节。
如果你不传入Stream
对象,让它生成自己的FileStream
,它将使用默认的4096
文件流缓冲区。
ReadLine
调用本身将在内部分配一个StringBuilder
,并将数据读取到byteBuffer
,然后解码字节并将其存储在charBuffer
中,然后将charBuffer
中的字符复制到StringBuilder
中,然后通过.ToString()
调用返回给您。
new StreamReader(@"C:'Users'UK'Panfile.txt")
在休息时将分配1024 + (1025 * 2) + 4096
1字节的内存(总共5120字节),在ReadLine
调用期间,它将最多分配一个额外的line.Length * 2 + StringBuilderOverhead + line.Length * 2
2。您看到的*2
是char[]
的,因为每个char
占用两个字节。
1: byteBuffer
+ charBuffer
+ FileStream
buffer
2: StringBuilder
内部的char[]
+字符串生成器缓冲区中的任何空闲空间+ .ToString()
调用返回的字符串。
每次只占用一行内存,因此这种方法非常适合处理大文件而不会占用大量内存。