【问题标题】:free memory of an local array of string in method C#在方法 C# 中释放本地字符串数组的内存
【发布时间】:2013-09-21 04:24:54
【问题描述】:

我最近遇到了关于我的程序使用的内存的问题。原因是我在方法中使用的字符串数组的内存。更具体地说,这个程序是从外部文件中读取一个整数数组。这是我的代码

class Program
{

    static void Main(string[] args)
    {
        int[] a = loadData();
        for (int i = 0; i < a.Length; i++)
        {
            Console.WriteLine(a[i]);
        }
        Console.ReadKey();
    }

    private static int[] loadData()
    {
        string[] lines = System.IO.File.ReadAllLines(@"F:\data.txt");
        int[] a = new int[lines.Length];
        for (int i = 0; i < lines.Length; i++)
        {
            string[] temp = lines[i].Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries);
            a[i] = Convert.ToInt32(temp[0]);
        }
        return a;
    }
}

文件 data.txt 大约 7.4 MB 和 574285 行。但是当我运行时,任务管理器中显示的程序内存为:41.6 MB。似乎我在 loadData() 中读取的字符串数组的内存(它是 string[] 行)没有被释放。怎么释放呢,以后再也不用了。

【问题讨论】:

  • 垃圾收集器运行时,该内存将自动释放。此外,您无法确定垃圾收集器何时实际运行。您无需担心。

标签: c# arrays string memory


【解决方案1】:

您可以在将行设置为 null 后调用 GC.Collect(),但我建议您查看所有答案 hereherehere。调用 GC.Collect() 是您很少想做的事情。使用诸如 C# 之类的语言的目的是它为您管理内存。如果您想对读入的内存进行精细控制,那么您可以创建一个 C++ dll 并从您的 C# 代码中调用它。

您可以逐行读取它并在该行上执行您需要的操作,而不是将整个文件读入一个字符串数组。那可能也会更有效率。

40MB 的已用内存会导致什么问题?您多久阅读一次数据?是否值得缓存它以备将来使用(假设 7MB 是可以容忍的)。

【讨论】:

  • 我只用过一次。
  • @khaimaitien 为什么不逐行读取文件并根据需要执行操作,而不是从读取字符串数组开始?您可以将 int[] 更改为 list ,这样会更高效并预先使用更少的内存。当然,何时释放内存仍取决于 GC。
  • 这只是一个例子,在我的真实程序中,我使用 Dictionary 类来保存一对字符串和整数。由于速度,建议使用容量已知的字典。
  • @khaimaitien,好的,你可以逐行读入字典。
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2020-07-20
  • 1970-01-01
相关资源
最近更新 更多