C# 如何处理OutOfMemoryException直到它不再抛出?
我知道C#中的最大对象大小是2GB。此外,每台电脑都有一个内存限制,它是32位还是64位 在我的应用程序中,我需要一个尽可能大的整数数组。因此,我需要的是处理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
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,可能不是最大尺码,但这就是我得到的。