Visual studio 当我有足够的内存时,为什么我要退出内存异常?

Visual studio 当我有足够的内存时,为什么我要退出内存异常?,visual-studio,f#,out-of-memory,Visual Studio,F#,Out Of Memory,我有一个程序(Fractal10),它执行一个循环,其中迭代次数取决于我手动设置的参数。当迭代次数较少时,程序运行良好。当迭代次数较大时,我得到以下错误: Unhandled Exception: System.TypeInitializationException: The type initializer for '<StartupCode$Fractal10>.$Program' threw an exception. ---> System.AggregateExcep

我有一个程序(Fractal10),它执行一个循环,其中迭代次数取决于我手动设置的参数。当迭代次数较少时,程序运行良好。当迭代次数较大时,我得到以下错误:

Unhandled Exception: System.TypeInitializationException: The type initializer for '<StartupCode$Fractal10>.$Program' threw an exception. ---> System.AggregateException: One or more errors occurred. ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 

为什么只有64%的内存被使用时我会出现这个错误?我能做些什么吗?

首先,您的操作系统是32位还是64位?如果是前者,您实际上将无法访问所有已安装的内存

此外,(我假设您使用的是.Net framework,如果我错了,请纠正我)您需要在构建配置中将平台目标设置为x64。除此之外,您还可以将以下配置添加到app.config文件中:



这将允许遍历大于2GB的对象。

如果要使用超过~1,8 GB的内存,则应使用64位版本的软件。

这是32位进程可用2GB地址空间的84%。您永远无法达到100%,在此之前,当分配找不到足够的连续内存时,分配会失败。当您有64位操作系统且内存太多时,强制程序以32位模式运行是没有用的。因此,只需删除强制,项目>属性>构建选项卡,取消选中“首选32位”。但再多挖一点也无妨,计算分形曲线不需要那么多内存。忘记对位图对象调用Dispose()是一个传统的疏忽。将目标设置为x64解决了内存问题,但程序运行速度慢了约1/3。这是一个很大的区别。有没有办法让它在64位和32位中运行得一样快?@Soldalma这是一个相当普遍的问题。您需要分析程序并找到瓶颈,例如,某些算法是否太慢?您使用的是最有效的数据结构吗?是否分配了太多的内存和太多的GC缓存?等在VS上运行探查器。根据我的经验,瓶颈往往是非常不直观的……好吧,但是为什么同样的程序在用64位编译时会在2.5分钟内运行,而在用32位编译时会在1.5分钟内运行?瓶颈是否会在64位编译下产生更多问题?我同意这一点,我认为需要进行一些分析。在计算上,您的程序不应该在更高的比特率系统上出现瓶颈。@Soldalma您所观察到的是特定于您的情况的,不能概括。对于计算密集型代码,我希望64位性能更好,但对于内存密集型代码,您可能会观察到64位速度较慢的情况,可能是由于许多问题,例如只使用更多内存、执行更多GC、不适合缓存等。您是否在启用优化的情况下以发布模式编译所有内容?无论哪种方式,配置文件::-)很有趣。
Memory: 64%
Fractal10 (32 bit)L 1,719.2 MB # this is the culprit
Microsoft Visual Studio 2017 (32 bit): 822.7 MB
... # other apps