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

C# 如何处理OutOfMemoryException直到它不再抛出?,c#,arrays,exception,int,out-of-memory,C#,Arrays,Exception,Int,Out Of Memory,我知道C#中的最大对象大小是2GB。此外,每台电脑都有一个内存限制,它是32位还是64位 在我的应用程序中,我需要一个尽可能大的整数数组。因此,我需要的是处理OutOFMemoryException,直到生成尽可能大的数组 我的代码如下: private int[] AllIntegers() { int[] all; int divider = 2; try { all = new int[int.MaxValue]; } ca

我知道C#中的最大对象大小是2GB。此外,每台电脑都有一个内存限制,它是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;
}
private int[]AllIntegers()
{
int[]全部;
整数除法器=2;
尝试
{
全部=新整数[int.MaxValue];
}
捕获(OutOfMemoryException)
{
all=新整数[int.MaxValue/除法器];
}
//可能会再次失败。如何有效地再次循环捕获
for(int i=0;i

该代码也将失败,我所寻找的是一个适当的方式循环,直到阵列可以

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

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

编辑:我不喜欢这种想法,因为我认为保存如此大量的数据是错误的 (和所有整数的数组?)

但是,以下是您需要的:

    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;
    }
static int[]AllIntegers()
{
int iSize=int.MaxValue;
int[]全部;
整数除法器=2;
while(true)
{
尝试
{
all=新整数[iSize];
打破
}
捕获(OutOfMemoryException)
{
iSize=iSize/除法器;
}
}
//可能会再次失败。如何有效地再次循环捕获
for(int i=0;i
EDIT2:
也许可以详细介绍一下您想要实现的目标?

编辑:我不喜欢这样的想法,因为我认为保存如此大量的数据是错误的 (和所有整数的数组?)

但是,以下是您需要的:

    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;
    }
static int[]AllIntegers()
{
int iSize=int.MaxValue;
int[]全部;
整数除法器=2;
while(true)
{
尝试
{
all=新整数[iSize];
打破
}
捕获(OutOfMemoryException)
{
iSize=iSize/除法器;
}
}
//可能会再次失败。如何有效地再次循环捕获
for(int i=0;i
EDIT2:
也许可以向我们详细介绍一下您想要实现的目标?

在内存中保存这么大的数组总是不是一个好主意


您不能将大数组拆分为小数组,并根据范围加载适当的数组吗?

在内存中保存这样大的数组总是不好的


您不能将大阵列拆分为小阵列,并根据范围加载相应阵列吗?

您的方案是什么?你为什么需要这个?你真的需要在内存中保存这么大的结构吗?为什么不使用一个动态增长的列表呢?即使你成功地做到了,你也无法使用它。一旦你用数组填满了操作系统允许的所有内存,你就没有任何空闲内存来分配更多的变量了。@Darin我只是在解释限制。目前没有特别的情况。你的意思是使用
列表
?限制是什么?@Svarog你是对的,但可能为了测试,我会减少数组大小,只留下一些内存。你的情况是什么?你为什么需要这个?你真的需要在内存中保存这么大的结构吗?为什么不使用一个动态增长的列表呢?即使你成功地做到了,你也无法使用它。一旦你用数组填满了操作系统允许的所有内存,你就没有任何空闲内存来分配更多的变量了。@Darin我只是在解释限制。目前没有特别的情况。你的意思是使用
列表
?这有什么限制?@Svarog你是对的,但可能为了测试,我会减少数组大小,只留下一些内存。一个
MemoryFailPoint
实例仍然抛出,尽管是不同的异常类型。它不会像发问者所希望的那样,再次尝试减少记忆量。仍然需要循环。是的,需要循环,但至少可以安全捕获异常。
MemoryFailPoint
实例仍会抛出异常,尽管异常类型不同。它不会像发问者所希望的那样,再次尝试减少记忆量。仍然需要一个循环。是的,需要一个循环,但至少可以安全地捕获异常。您测试过这个吗?OOM很难抓到。@HenkHolterman是的,我得到的尺寸是134217727,可能不是最大尺寸,但这就是我得到的。你测试过这个吗?“OOM很难抓到!”亨克沃特曼是的,我有,我得到的尺码是134217727,可能不是最大尺码,但这就是我得到的。