C# 字符串C中的内存问题#

C# 字符串C中的内存问题#,c#,string,garbage-collection,C#,String,Garbage Collection,我没有什么考试计划 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 =

我没有什么考试计划

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的数据。当程序get执行时,会占用大量内存,因为字符串是不可变的。使用字符串处理此类场景的更好方法是什么

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

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

请帮忙。谢谢

更新:

我想我没有解释清楚。很抱歉给你带来了困惑。 我只是从文件中读取数据以获取大量数据,因为我不想在代码中创建60MB的数据。 我的痛点在代码行下面,在响应字段中有大量数据


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

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

    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)

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

StreamReader
只提供了您要查找的
Read
版本,这让您可以选择流的第一个字符。或者,您可以使用常规的
StreamReader逐字读取。阅读
,直到您确定您有足够的内容

    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

上中继,不要在code!中调用GC.Collect()。NET将在操作系统内存不足时调用它。在某些情况下可以调用它,但大多数情况下最好不要使用它。“字节块”是阅读文本文件时非常痛苦的建议,因为你需要知道编码……好吧,字符/字节什么的。问题是,用户询问的是如何读取大文件。最有效、占用内存最少的方法是使用预设缓冲区,而不是试图将整个文件吸收到内存中。使用StreamReader,您可以指定一个参数来查看字节顺序标记以确定编码。
    var textBuffer = new char[5];
    reader.ReadToEnd(textBuffer, 0, 5); // TODO: check if it actually read engough
    t.Response = new string(textBuffer);