如何处理OutOfMemoryException,直到它不再抛出?

时间:2011-12-18 12:42:41

标签: c# arrays exception int out-of-memory

我知道C#中的最大对象大小是2GB。每个特定的PC都有一个内存限制,它是32位或64位。

在我的应用程序中,我需要尽可能大的整数数组。所以我需要的是照顾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;
}

代码也会失败,我正在寻找的是一种正确的循环方式,直到可以制作数组!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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: 也许用我们想要实现的目标来详细说明我们?

答案 2 :(得分:1)

在内存中保存如此大的数组始终不是一个好主意。

你不能将大数组分成小数组,并根据范围来加载适当的数组吗?