【问题标题】:C# Huge object initializer throws Stack Overflow errorC# 巨大的对象初始化程序抛出堆栈溢出错误
【发布时间】:2016-08-22 06:41:49
【问题描述】:

我需要构建一个 对象,其中包含几乎 20000 个嵌套对象(在多个级别中)。每个对象都是具有 1-5 个字段或实体列表的简单数据库实体。我正在使用内联对象初始化器来初始化我的根对象。

new OUTPUT() { XREF_CATALOG_MATERIALS = xrefCatalogMaterials.Find(x => x.MATERIAL.PART_NUM.Equals("xxxx")), FUNCTION = new FUNCTION() {...

我尝试在 x86x64 模式下运行,在这两种情况下我都得到 stackoverflow 异常。在我的对象不是那么大(大约 6000 个嵌套对象)的其他情况下,相同的代码和逻辑可以正常工作

有没有办法增加 .Net 应用程序堆的大小?有什么建议可以用来解决这个问题吗?

【问题讨论】:

  • 你最好只加载你需要的东西,因为你需要它。我发现每次加载该对象时都需要全部 20,000 个对象是非常令人怀疑的。
  • 增加堆栈大小(不是堆大小,它不是 heap 溢出)似乎不是一个很好的解决方案。问题在于设计,而不是主机系统。你有太多的嵌套函数调用。
  • @krillgar 我同意有问题的设计,我从另一个开发人员那里继承了代码,如果可能的话想尽快修复它。
  • 这总是很有趣,我很遗憾听到这个消息。你最好的选择是花一些额外的时间(这可能是巨大的)来把它做好。在那段时间向你的主管恳求,否则你以后将花费 10 倍的努力来修复其他在以后继续突然出现的错误。

标签: c# .net large-object-heap


【解决方案1】:

根据该描述,您对堆大小没有问题。你有堆栈大小的问题。看起来您正在尝试调用太多嵌套函数。每个函数调用都会对堆栈产生影响。 栈比堆小很多,比较容易溢出。最简单的方法是递归。

https://msdn.microsoft.com/en-us/library/system.stackoverflowexception(v=vs.110).aspx

StackOverflowException is thrown for execution stack overflow errors, typically in case of a very deep or unbounded recursion.

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2014-05-17
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2011-01-19
    • 2016-11-11
    • 2014-04-12
    相关资源
    最近更新 更多