OutOfMemoryException错误

sla*_*dhe 1 c#

我只是在我的Windows应用程序项目中写两行

double[] results = new double[100000000];

double[] results1 = new double[100000000];
Run Code Online (Sandbox Code Playgroud)

在第二行(results1)我得到了异常'System.OutOfMemoryException'被抛出.

好吧,我的系统配置是

RAM- 4 GB

操作系统 - Windows 7

处理器 - 两核2.93 Ghz的英特尔核心

我该如何解决此错误以及发生此错误的原因

好的,因为大部分答案都是针对通用列表的

       List<int> results1 = new List<int>();
         List<int> results2 = new List<int>();



        for (int i = 0; i <= 100000000; i++)
        {
            results1.Add(i);
            results2.Add(i);
        }
Run Code Online (Sandbox Code Playgroud)

我也在这里得到同样的错误

Tim*_*oyd 8

创建数组时,内存分配器将尝试保留分配点所需的总内存量.在这种情况下,每个元素将为8个字节.在这种情况下,OOM非常简单,没有足够的内存来分配这样的大型数组.在标准的32位Windows配置中,对于用户代码和数据,每个进程最多只能有2GB的内存地址空间,但实际上由于内存碎片,它通常比这少得多.在碎片化的情况下,在处理大型数组时,OOM被更好地解释为"找不到足够大的连续内存部分".


Dar*_*rov 5

你不应该分配那些不适合内存的大型数组.只需使用列表并根据需要添加元素:

var results = new List<double>();
Run Code Online (Sandbox Code Playgroud)

文档中引用:

int[] array = new int[5];
Run Code Online (Sandbox Code Playgroud)

该数组包含从array [0]到array [4]的元素.new运算符用于创建数组并将数组元素初始化为其默认值.在此示例中,所有数组元素都初始化为零

所以你需要有足够的内存来保存这些默认值.


Mar*_*ell 5

这是一个800MB阵列,您正试图加载到win32进程空间(2GB).它也需要连续,这使得它更难.简单来说 - 它在LOH中找不到一个足够大的连续块,以便将所有这些整合在一个大块中.

三种选择:

  • 不要分配如此庞大的阵列 - 你真的需要吗?
  • 切换到锯齿状阵列; 分配多个中型数组更容易; 例如double[][]用10000个内阵列的每个长度10000 -只是做一些/%代码进入右块
  • 切换到x64(注意阵列仍然硬限制为2GB)

  • @slash - double = 8个字节,乘以100000000个单元格; KB除以1024,MB再加1024 (2认同)