c# - 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,它也会在完全相同的点上以相同的错误而死。有任何想法吗?
解决方案
感谢@GiddyaNaya 的回答 - 问题是该项目没有构建为 x64。完成所有配置设置后,我发现在 2 个级别的深处,它仍然设置为 Any CPU。再次感谢您对此的帮助。
推荐阅读
- python - 将 UWSGI 和 TinyRPC 与 Flask 蓝图挂起应用程序一起使用?
- angular - RxJS - Shared Observables 不共享 observable 值
- javascript - 传递给子组件时道具未定义(反应钩子)
- discord.js - 即使我在语音频道中,“message.member.voice”也会返回未定义 - discord.js
- jestjs - 使用 svelte-kit build 后未定义 jest
- flutter - 颤振无法从 vscode 运行 IOS 构建
- html - html中的滚动条
- kubernetes - srimzi/kafka docker-compose 日志配置
- django - Django:无法在模板内进行计算
- jasper-reports - 如何从参数创建包含静态和动态值的表?