希望有人可以帮助我,我没有想法!
我有一个密集的方法来创建对象并将其放入队列。看起来很像:
private void LongMethod()
{
for (int i=0; i<number;i++)
{
for (int j=0; j<number; j++)
{
object o = new object();
queue.enqueue(o);
}
}
}
但是,有时number
值非常大,因此,根据可用的内存量,有时会抛出OutOfMemory Exception。
所以我一直想做的是这样的:
private bool CheckingMethod(number)
{
long initialValue = System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;
object o = new object();
queue.Enqueue(o)
long difference = initialValue - System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;
if(Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory <= difference * number * number)
{
return true;
}
return false;
}
然后,调用方法可以执行以下操作:
private void CallingMethod(number)
{
if(CheckingMethod(number)
{
LongMethod(number);
}
}
我试图在运行longMethod之前检查它是否会导致OOM异常。我的问题是,difference
这将给我一个截然不同的值,因此有时我仍然会遇到outOfMemory异常。有一个更好的方法吗?
很有可能您需要重新设计该算法,以便它不会尝试将“所有内容”放入队列中……或者根本不使用队列。例如,可以在此处使用迭代器吗?
的逻辑LongMethod
(目前表示为双嵌套循环)可以等效地表示为一种算法(赋予struct
某种类型以使其在调用之间处于“保持状态”),每次都返回(或“产生”)新的算法object()
。
重新表达该算法将使您免于“一次全部”生成大量对象并将它们“一次全部”放入队列的义务。取而代之的是,有可能一次“按需”生产对象,和/或生产和排队“某些”对象,同时保留在将来某个时间生产“更多”对象的能力。
您真的不能“捕获” OOM异常:当发生这种情况时,“该程序已经死了十分之九,几乎可以肯定会很快淹死。” 您需要某种算法的重新设计,以消除对“如此庞大的'队列'”的需求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句