首页 > 解决方案 > C# HashSet 偶尔但可重现地生成 System.OutOfMemoryException

问题描述

所以我们有两个项目——一个我们可以称之为 MainProject 的核心项目,它有一个名为的函数,可以一次LoadData()将 33,751,107 个字符串文本记录加载到一个HashSet中,还有一个我们可以称之为 TestProject 的单元测试项目,它运行一个单元测试LoadData(它参考 MainProject)。

如果我们在 TestProject 中运行单元测试,它会成功通过并加载所有 33,751,107 条记录,没有错误。

但是,如果我们在 MainProject 启动期间运行 LoadData() 函数,它会崩溃并出现以下异常:

System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。

有趣的是,它在成功加载 23,986,243 条记录然后尝试加载下一批后崩溃。

这很奇怪。函数如何LoadData在 MainProject (这是一个 ASP.NET 4.6.1 Web 项目)中崩溃,而不是在仅运行相同功能的 TestProject (这是 .NET Framework 4.7.2 单元测试项目,使用 MSTest 框架)中崩溃LoadData

我什至尝试将 MainProject 升级到 ASP.NET 4.7.2(没有效果,仍然崩溃)。MainProject 的 web.config 或 TestProject 的 app.config 没有什么特别之处。我尝试将其添加到 web.config:

<gcAllowVeryLargeObjects enabled="true"/>

这并没有改变或解决问题。这种行为不是随机的,也不是间歇性的——它每次都会重复发生。我没主意了。

有谁知道为什么会发生这种情况?

任何帮助将不胜感激。

更新:我尝试创建一个 SuperHashSet 类,该类创建多个 HashSet 的集合,每个 HashSet 的最大项目数为 10,000,000 个项目。即使它使用〜3+ HashSets而不是一个大的HashSets,它也会在完全相同的点上以相同的错误而死。有任何想法吗?

标签: c#asp.net.net

解决方案


感谢@GiddyaNaya 的回答 - 问题是该项目没有构建为 x64。完成所有配置设置后,我发现在 2 个级别的深处,它仍然设置为 Any CPU。再次感谢您对此的帮助。


推荐阅读