2016-08-10 12 views
1

誰かが私を助けることができると願って、私はアイデアがありません!OutOfMemory例外をキャッチするC#

私は、オブジェクトを作成してキューに入れる集中的な方法を持っています。それは次のようにたくさん見える:

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例外がスローされます。

それでは、私がやろうとしてきたことはこれです:私はそれかどうか、longMethodを実行する前にチェックしようとしてる

private void CallingMethod(number) 
    { 
    if(CheckingMethod(number) 
     { 
     LongMethod(number); 
     } 
    } 

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; 
} 

そして、呼び出し元のメソッドを行うことができますOOM例外が発生します。私の問題はdifferenceが私に劇的に異なる価値を与えることになるので、時にはoutOfMemory例外が発生することがあります。これを行うより良い方法はありますか?

+0

「数字」はどれくらい大きいですか?割り当てているオブジェクトの大きさはどれくらいですか? –

+0

正しいデータ型を選択するのが正しい方法です... –

+0

@MitchWheatの数値はユーザーの入力です。考えられるのは、例外をスローせずに最高の数値を可能にすることです。それは私が把握しようとしているものです。各オブジェクトがどれだけのメモリを使用しているか知りたい。 –

答えて

3

このアルゴリズムでは、「すべて」をキューに入れようとしないようにするか、まったくキューを使用しないことがあります。たとえば、イテレータをここで使用できますか?

現在ダブルネストされたループとして表されるLongMethodの論理、等価(呼び出しの間「の状態を保持する」ために、いくつかの種類のstructを与えられる)アルゴリズム、戻り(のように表すことができまたは毎回新しいobject()が「収穫」されます)。

このアルゴリズムを再表現すると、一度に膨大な数のオブジェクトを生成し、「一度に」キューに配置するという義務から解放されます。その代わりに、「オンデマンドで」オブジェクトを1つずつ生成したり、「いくつかの」オブジェクトを生成してエンキューしたりすることは可能です。

OOMの例外を「キャッチ」することはできません。そのようなことが発生した場合、「プログラムはすでに9分の10で死んでおり、ほぼ確実に溺れてしまいます。 「大規模なキュー」の必要性を排除するアルゴリズムの再設計が必要です。