.net 在运行时使用消息“OutofMemoryException”;内存不足,无法继续执行程序;

.net 在运行时使用消息“OutofMemoryException”;内存不足,无法继续执行程序;,.net,wpf,exception,.net,Wpf,Exception,我在运行时得到OutofMemoryException,消息是“内存不足,无法继续执行程序”。我在程序开始时加载图像。每个图像的大小为50+MB。如果图像大小增加到277MB,那么我会得到这个异常。我立即加载图像,因为我必须在开始时显示它们的缩略图 我在考虑缓存和分页解决方案。我不知道是否有可能使用更多的系统内存或其他解决方案 谢谢您可能会尝试允许您的程序访问更多内存,但这将是一场斗争。对于.NET应用程序,内存量由machine.config文件中的processModel/memoryLit

我在运行时得到OutofMemoryException,消息是“内存不足,无法继续执行程序”。我在程序开始时加载图像。每个图像的大小为50+MB。如果图像大小增加到277MB,那么我会得到这个异常。我立即加载图像,因为我必须在开始时显示它们的缩略图

我在考虑缓存和分页解决方案。我不知道是否有可能使用更多的系统内存或其他解决方案


谢谢

您可能会尝试允许您的程序访问更多内存,但这将是一场斗争。对于.NET应用程序,内存量由machine.config文件中的processModel/memoryLit设置控制。Microsoft建议您将其设置为不高于60%

然而,您正在同时加载50+MB的图像,以显示缩略图(可能尺寸很小)。我建议这是你改变的地方。您可以逐个加载图像,然后生成缩略图并立即释放内存

在任何情况下,当您试图显示缩略图时,拥有50 MB以上的图像都是无效的。难道你不能保存缩略图而不必每次都生成它们吗

是否有可能使用更多的系统内存或其他解决方案

切换到64位是唯一简单的选择

每个对象有一个基本的.NET 1GB限制(也适用于64位),但这不是您的问题。为了创建一个对象.NET需要在这个过程中有足够的连续可用内存。一旦您有几个非常大(>250MB)的大型对象在处理中,就越来越不可能有足够的连续地址空间可用

选项:

  • 使用多个进程和进程间通信,以及由此带来的所有额外复杂性(特别是在故障情况下)
  • 一次仅加载一个图像
  • 64位

另外,阅读“Windows内部构件”,了解Windows如何管理内存,然后了解.NET GC如何管理后台内存。当你推送如此多的数据时,没有什么可以替代知道发生了什么。(像这样的工具会有所帮助,但前提是你对这一切的工作原理有一个核心的了解。)

谢谢雨果。这是个好主意。