有多少内存受到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的影响

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。您看到的*2char[]的,因为每个char占用两个字节。

1: byteBuffer + charBuffer + FileStream buffer
2: StringBuilder内部的char[] +字符串生成器缓冲区中的任何空闲空间+ .ToString()调用返回的字符串。

每次只占用一行内存,因此这种方法非常适合处理大文件而不会占用大量内存。