2011-12-18 3 views
1

私はC#の最大オブジェクトサイズが2GBであることを知りました。また、特定のPCごとにメモリ制限があり、32ビットまたは64ビットのいずれかです。OutOfMemoryExceptionが再びスローされない限り処理する方法は?

私のアプリケーションでは、可能な限り大きな整数の配列が必要です。だから私が必要とするのは、最大の可能な配列が作られるまで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; 
} 

コードも失敗します、私は配列刚性ループの適切な方法を行うことができているを探しています!

+1

あなたのシナリオは何ですか?なぜこれが必要ですか?あなたは本当にそのような大きな構造を記憶しておく必要がありますか?動的に成長するリストを使用してみませんか? –

+0

これを成功させても、それを使用することはできません。アレイでOSが許可しているすべてのメモリをいっぱいにすると、それ以上の変数を割り当てる空きメモリはありません。 – Svarog

+0

@ダーリン私は限界を表現しています。現時点では特別なシナリオはありません。あなたが意味するのは 'List 'ですか?それには限界がありますか? –

答えて

2

EDIT:私はそのようなデータ の大量保持するために間違っていると思うので、私は、この考えを好きではない

しかし、ここで何を」だ(およびすべての整数の配列を?)

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:を探して再 たぶん、あなたが達成しようとしているものを私たちに手の込んだ?

+0

これはテストしましたか? OOMは捕まえにくいです。 –

+0

@HenkHoltermanはい私は持っているサイズは134217727 おそらく最大サイズではありませんが、私が得たものです。 – Shai

2

System.Runtime.MemoryFailPointを使用して、オブジェクトを割り当てる前に十分なリソースが利用可能かどうかを確認してください。

+0

'MemoryFailPoint'インスタンスは、異なる例外タイプですが、まだスローされます。それは、質問者が望むように、メモリ量を減らして再試行しません。それでもループが必要です。 –

+0

はいループは必要ですが、少なくとも例外は安全にキャッチ可能です。 –

1

このような大きな配列をメモリに保持することは、常に良い考えではありません。

大きな配列を小さな配列に分割することはできませんし、範囲に基づいて適切な配列を読み込むことはできませんか?

関連する問題