2017-10-08 3 views
0

私は極端に大きな配列で作業する必要があるプログラムがあります。 2次元配列を使用する必要があります。C#の配列のインデックス型をInt64に変更します。

私は古典的なbool[,]を使用しましたが、インデックスが大きすぎると宣言しようとするとSystem.OutOfMemoryExceptionが投げられました。 (bool[,] foo = new bool[width + bar, height]を使用)。数字widthbarはどちらも極端に大きかったので、インデックスを超えました。

インデックスの種類をInt64(long)に変更するにはどうすればよいですか?私はDictionary<ulong, bool>を使うことができると知っていますが、アプリケーションのほぼすべてのコードを書き直す必要があり、辞書が必要なLINQメソッドを持っている場合は、それが2次元の辞書で動作するのであれば。

おかげで、ピーター

EDIT 1:ここでは は(注:私はちょうどsizeX = 2000000000でそれをテストしてみた、それは例外を投げた):コードだ問題は

bool[,] pole = new bool[sizeX, maxY]; 
ある

、IそれらのX、Y-長さ、およびX-長さ(Yは常に0)を持つ多くのオブジェクトを持ちます。私は、各位置に、オブジェクトタイルがあるかどうかの配列を持っています。

だから私はちょうどcoord X、幅&の高さと位置のタイルを配列に取得します。で、Xは、私は、たとえば10個のオブジェクトを配置する必要があるときに、私は最低のXを取得し(そしてたとえばlargestNegativeX = -999のためにそれを保存)、することができ、配列にオブジェクトを配置する前に、私はすべてのオブジェクトのに追加

ポイントX object.X += -largestNegativeX。次に配列の幅を計算し(例えば2000000000)、配列を宣言しようとします。例外がスローされます。

+1

[BitArray](https://msdn.microsoft.com/en-us/library/system.collections.bitarray(v = vs.110).aspx)を使用してください。 bool値をビットとして格納し、メモリを消費しません。 –

+7

これはxyの問題のようです。特定のユースケースについて質問すれば、より良い解決策を得ることができます。 – Logarr

+0

ここで辞書を使用しても問題はありません。 –

答えて

0

ここで辞書を使用するのは間違いありませんが、それはあなたがカスタムソリューションを作成する場合に最も可能性が高いハンドロールです。また、ほぼすべてLINQ methodsをサポートしています。それは、単一のディメンションを持つ配列としてで動作するように快適ではない、

bool[,] myArray = new bool[int.MaxValue, int.MaxValue]; 

OK:

+0

3.7GB RAMを使用した後にプログラムが強制終了されました:-D [死亡前のスクリーンショット0.7gb](http://ibb.co/nOSfJw) 明日は巨大なRAMを搭載したより良いPCで試してみますが、それは助けると思う – SoptikHa

+0

私はちょうどあなたの質問をもう一度見て、あなたは配列/辞書でやっていることを再考する必要があります。一度に多くのデータを保持する必要があるのはなぜですか? RAMが使い尽くされるのを待つのではなく、チャンクまたはオンザフライでデータを処理することを検討してください。 –

+0

ありがとう、私は偉大なコレクションを使用せずにそれを行う別の方法を試してみるだけでなく、あなたが書いたものを見てみましょう – SoptikHa

-2

あなたは次のように、二次元配列を使用することができます。これを回避するには、この多次元配列を内部的に使用し、IEnumerableを実装するカスタム型を実装することをお勧めします。

+0

私はすでにEDIT 1に見られるようにそれを行う – SoptikHa

関連する問題