【问题标题】:Clearing the memory associated to a large List清除与大列表关联的内存
【发布时间】:2017-05-18 20:54:15
【问题描述】:

我听从了this SO Question 的建议。它对我不起作用。这是我的情况和与之相关的代码

我有一个很大的列表,里面有 204 万个项目。我将其读入内存进行排序,然后将其写入.csv 文件。我有 11 个.csv 需要阅读并随后排序的文件。第一次迭代给我的内存使用量刚刚超过 1GB。我尝试将列表设置为null。我试过打电话给List.Clear() 我也试过List.TrimExcess()。我也一直在等待GC 做它的事情。通过希望它知道该列表没有读取或写入。

这是我正在使用的代码。非常感谢任何建议。

foreach (var zone in zones)
{

    var filePath = string.Format("outputs/zone-{0}.csv", zone);

    var lines = new List<string>();

    using (StreamReader reader = new StreamReader(filePath))
    {

        var headers = reader.ReadLine();

        while(! reader.EndOfStream)
        {
            var line = reader.ReadLine();

            lines.Add(line);
        }

        //sort the file, then rewrite the file into inputs

        lines = lines.OrderByDescending(l => l.ElementAt(0)).ThenByDescending(l => l.ElementAt(1)).ToList();

        using (StreamWriter writer = new StreamWriter(string.Format("inputs/zone-{0}-sorted.csv", zone)))
        {
            writer.WriteLine(headers);
            writer.Flush();

            foreach (var line in lines)
            {
                writer.WriteLine(line);
                writer.Flush();
            }
        }

        lines.Clear();
        lines.TrimExcess();

    }
}

【问题讨论】:

  • 还有什么问题?如果 GC 不回收内存,那是因为它不需要。从您发布的代码来看,似乎没有任何问题。
  • @InBetween 问题是第二次通过foreach时出现内存不足异常
  • 您是否在 32 位环境中运行?
  • @InBetween 我认为发生这种情况的原因是没有收集为第一次迭代列表分配的内存。当下一次迭代开始时,GC 也不会收集分配给它的内存。我怎样才能从这里继续前进?据我所知,我使用的是 64 位环境。让我确认一下。
  • 首先不要将项目放在List 中。你在毫无意义地创建一个新列表,并花费大量资源来创建它,然后你什么都不做,只是把它扔在地板上,然后担心清理它需要做多少工作。既然你不需要它,就不要一开始就创建它。

标签: c# csv garbage-collection


【解决方案1】:

尝试将整个内容放在using

using (var lines = new List<string>())
{ ... }

虽然我不确定嵌套的usings。

相反,如果您有 lines.Clear;,请添加 lines = null;。这应该会鼓励垃圾收集器。

【讨论】:

  • List&lt;T&gt; 没有实现IDisposable,所以这不会编译。它没有非托管资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2019-11-08
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多