字符串C#中的内存问题

本文关键字:内存 问题 字符串 | 更新日期: 2023-09-27 18:21:10

我几乎没有测试程序

public class Test
{  
    public string Response { get; set; }
}

我的控制台只需调用测试类

class Program
{
 static void Main(string[] args)
 {
  Test t = new Test();
  using (StreamReader reader = new StreamReader("C:''Test.txt"))
  {
     t.Response = reader.ReadToEnd();
  }                       
  t.Response = t.Response.Substring(0, 5);
  Console.WriteLine(t.Response);
  Console.Read();
 }     
}

我的Test.txt文件中有大约60 MB的数据。当程序执行时,它占用了大量内存,因为字符串是不可变的。使用字符串处理这种情况的更好方法是什么。

我知道我可以使用字符串生成器。但我创建这个程序是为了在我的一个使用字符串的生产应用程序中复制一个场景。

当我尝试使用GC.Collect()时,内存会立即释放。我不确定是否可以在代码中调用GC。

请帮忙。谢谢

更新:

我想我没有解释清楚。很抱歉造成混乱。我只是从文件中读取数据以获得巨大的数据,因为我不想在代码中创建60MB的数据。我的痛点是在代码行下面,我在响应字段中有大量数据。

t.响应=t.响应.子串(0,5);

字符串C#中的内存问题

您可以将读取限制为一个字节块(缓冲区)。循环并将下一个块读取到缓冲区中,然后将该缓冲区写出来。这将防止大量数据存储在内存中。

    using (StreamReader reader = new StreamReader(@"C:'Test.txt", true))
    {
        char[] buffer = new char[1024];
        int idx = 0;
        while (reader.ReadBlock(buffer, idx, buffer.Length) > 0)
        {
            idx += buffer.Length;
            Console.Write(buffer);
        }
    }

您能逐行读取文件吗?如果是这样,我建议致电:

IEnumerable<string> lines = File.ReadLines(path)

当您使用迭代此集合时

foreach(string line in lines)
{
    // do something with line
}

集合将使用惰性求值进行迭代。这意味着在对每一行执行操作时,不需要将文件的全部内容保存在内存中。

StreamReader只提供您想要的Read的版本-Read(Char[],Int32,Int32)-它允许您挑选流的第一个字符。或者,您可以使用常规StreamReader.Read逐个读取字符,直到您决定有足够的字符为止。

    var textBuffer = new char[5];
    reader.ReadToEnd(textBuffer, 0, 5); // TODO: check if it actually read engough
    t.Response = new string(textBuffer);

请注意,如果您知道流的编码,您可以使用较低级别的读取作为字节数组,并使用System.Text.Encoding类来构造自己编码的字符串,而不是在StreamReader上中继。