2011-12-18 37 views
1

我知道C#中的最大对象大小是2GB。此外,每个特定PC都有一个内存限制,不管是32位还是64位。如何处理OutOfMemoryException,直到它不再被抛出?

在我的应用程序中,我需要一个尽可能大的整数数组。所以我需要的是照顾OutOFMemoryException,直到最大可能的阵列!

我结束了下面的代码:

private int[] AllIntegers() 
{ 
    int[] all; 
    int divider = 2; 

    try 
    { 
     all = new int[int.MaxValue]; 
    } 
    catch (OutOfMemoryException) 
    { 
     all = new int[int.MaxValue/divider]; 
    } 
    //Probably will fail again. how to efficently loop the catch again 

    for (int i = 0; i < all.Length; i++) 
    { 
     all[i] = i; 
    } 

    return all; 
} 

的代码也将失败,我所寻找的是能够进行循环数组直到有道!

+1

你的情况是什么?你为什么需要这个?你真的需要在记忆中保存这么大的结构吗?为什么不使用动态增长列表? – 2011-12-18 12:52:36

+0

即使您成功做到了,您也无法使用它。一旦用数组填充了操作系统允许的所有内存,就不会有任何可用内存来分配更多变量。 – Svarog 2011-12-18 12:56:43

+0

@Darin我只是实现了极限。目前没有特别的情况。你的意思是使用'List '?那会是什么限制? – 2011-12-18 13:01:22

回答

2

编辑:(?和所有的整数数组)我不喜欢这个主意,因为我认为这是错误的,持有如此大量的数据 的

但是,这里就是你”重新寻找:

static int[] AllIntegers() 
    { 
     int iSize = int.MaxValue; 
     int[] all; 
     int divider = 2; 

     while (true) 
     { 
      try 
      { 
       all = new int[iSize]; 
       break; 
      } 
      catch (OutOfMemoryException) 
      { 
       iSize = iSize/divider ; 
      } 
     } 

     //Probably will fail again. how to efficently loop the catch again 

     for (int i = 0; i < all.Length; i++) 
     { 
      all[i] = i; 
     } 

     return all; 
    } 

EDIT2: 也许阐述我们与您要实现的目标是什么?

+0

你测试了这个吗? OOM很难被捕获。 – 2011-12-18 13:37:52

+0

@HenkHolterman是的,我得到的尺寸是134217727 可能不是最大尺寸,但那就是我得到的。 – Shai 2011-12-18 13:41:04

2

使用System.Runtime.MemoryFailPoint在尝试分配对象之前检查是否有足够的资源可用。

+0

'MemoryFailPoint'实例仍然抛出,尽管是一个不同的异常类型。正如提问者想要的那样,它不会再尝试减少记忆量。循环仍然是必要的。 – 2011-12-18 13:00:05

+0

是需要循环,但至少可以安全捕获异常。 – 2011-12-18 13:44:36

1

把这么大的数组放在内存中总是不是个好主意。

难道你不能把你的大数组分成小数组,并且基于范围来加载适当的数组吗?

相关问题