【问题标题】:C# Out of Memory exception while adding elements to List<List<int>> using ToList() [duplicate]使用 ToList() 将元素添加到 List<List<int>> 时出现 C#Out of Memory 异常
【发布时间】:2020-04-18 13:30:32
【问题描述】:

尝试将大型列表添加到 int 列表中时,出现内存不足异常。在下面发布一个可重现的 sn-p 来说明问题:

List<long> Arr = new List<long>();
List<List<long>> lstArr = new List<List<long>>();

for (long i = 0; i < 20000; i++)
{
    for (int k = 0; k < 20000; k++)
    {
        Arr.Add(k);
    }

    // Below is the line that generates the exception
    lstArr.Add(Arr.ToList());
    Arr.Clear();
}

Console.ReadLine();

我们如何解决这个问题?请注意,理想情况下我们应该使用List&lt;List&lt;int&gt;&gt;。我完全理解这是一个堆内存分配问题。因此,我正在尝试一种代码解决方法 /alternate 来解决此问题。 再次感谢!

【问题讨论】:

  • 尝试使用具有预定义长度的数组,检查此脚本,` var Arr = new long[20000]; var lstArr = 新长 [20000]; for (long i = 0; i
  • 如果您无法设置gcAllowVeryLargeObjects,那么另一种解决方法是设置多个列表,每个列表都在限制范围内。

标签: c# list int


【解决方案1】:

请尝试在您的 app.config 中设置gcAllowVeryLargeObjects,请参阅此link。有一个堆内存大小限制,您可能已经超过了。

【讨论】:

  • 是的,我同意它的堆内存大小限制,但不幸的是我无权访问配置文件。解决方法需要在代码本身中
  • @MRK 另一种选择是找到基于磁盘的解决方案(如数据库)。当我们要处理大量数据时,我们不会将所有内容都存储在内存中。相反,我们进行查询以从磁盘检索部分数据并处理它们。在生产应用程序中,您的代码会造成巨大的内存泄漏。
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 2018-08-06
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多