2011-01-27 28 views
14

かなり大きな二重配列12000ish x 55000ishを作成する必要があります。残念ながら、メモリ不足例外が発生します。私はJavaで開発していましたが、メモリ設定を変更する可能性がありました。これはC#で可能ですか、それとも不可能なのでしょうか?私はVS 2008を使用しています。大規模配列の宣言時にOutOfMemoryExceptionが発生する

+1

A *かなり*大きな配列? :) – Groo

+0

私はあなたが "メインメモリ"のデータ構造(すなわちデータベース)の外を考えることをお勧めします。なぜあなたはそのような大きなダブル配列を格納する必要がありますか? – bitxwise

+0

私は「公正に」という言葉の選択で笑った。 –

答えて

25

doubleは8バイトなので、5GBを少し上回る1つのアレイを割り当てようとしています。 CLRは、64ビットCLRの場合でも、オブジェクト単位の制限が約2GB IIRCです。言い換えれば、使用可能なメモリの総量ではありません(ただし、に十分なメモリがある場合はには問題があります)が、オブジェクト単位のサイズです。

私はあなたを小さな配列に分割することをお勧めします。おそらく何らかの説明のファサードの後ろにあります。私は、単一配列の限界を回避する方法はないと信じています。

EDIT:あなた配列の配列のために行くことができる - ジャグ配列別名:

double[][] array = new double[12000][]; 
for (int i = 0; i < array.Length; i++) 
{ 
    array[i] = new double[55000]; 
} 

それはあなたに受け入れられるだろうか?

(つまり、同じオブジェクトごとのサイズの問題を抱えていると同じようにあなたが矩形配列(double[,])を使用することはできません。)

+0

+1を設定すると、この問題を解決できるかもしれません。私はとても怠惰ではないはずです – Ian

+0

大丈夫です。それで、仮想メモリを使用できませんでしたか? – cs0815

+1

ダブル配列の代わりに、2D配列を意味すると思います – bitxwise

0

あなたはメモリ不足(いくつかのプログラムを閉じる)か、メモリ割り当て制限(約2Gb)に達していますか、このメモリは連続ブロックである必要があります。あなたは64ビットマシンを使用することができます。その場合、より多くのメモリを利用できます。あるいは、アプリケーションが大規模なアドレスを認識できるようにすることができます(この場合、可能であれば、グーグルがこれを行う方法を教えます)。

大規模なアドレス認識のために、Boot.iniファイルに/ 3GBスイッチを追加すると思います。

9

あなたが2GBを超えるオブジェクトを作成することはできませんので、あなたがMemoryMappedFileを使用しようとすることができ必要なサイズのメモリチャンクで作業します。

 

var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L); 
var view = data.CreateViewAccessor(); 
var rnd = new Random(); 

for (var i = 0L; i < 12000L; ++i) 
{ 
    for (var j = 0L; j < 55000L; ++j) 
    { 
     var input = rnd.NextDouble(); 
     view.Write<double>(i * 55000L + j, ref input); 
    } 
} 
 
4

あなたの総メモリが十分であることを提供し、あなたは小さなアレイの束を作成し、単一IList<T>、または他のいくつかのインデックス付きのインタフェースでそれらをラップすることにより、LOHの断片化に起因するメモリの例外のうち防ぐことができます。

BigArray<T>, getting around the 2GB array size limit

クレジット:this post (C# chunked array)ここ

は、それを説明するリンクです。

関連する問題