2017-10-08 30 views
0

我有程序,我必須使用極端大數組。 我需要使用二維數組。將C#數組索引類型更改爲Int64

我用過古典bool[,],但是當我試圖在索引太大的時候聲明它時拋出了System.OutOfMemoryException。 (使用bool[,] foo = new bool[width + bar, height])。兩個數字widthbar都非常大,所以我想它只是超過了指數。

如何將索引類型更改爲Int64(long)?我知道我可以使用Dictionary<ulong, bool>,但它會迫使我重寫我的應用程序中的幾乎所有代碼,並且我發現數組更適合使用Dictionary進行工作,特別是當我已經有我需要的LINQ方法並且我不知道時,如果它能用於二維字典。

謝謝,彼得

編輯1: 下面的代碼(注:我剛剛與sizeX = 2000000000測試它,它拋出異常):

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

的問題是,我有許多對象的X,Y長度和X長度(Y總是0)。我有一個數組,在每個位置上,有或者不是對象拼貼。

因此,我只是得到座標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

+0

使用3.7GB RAM後程序被殺死:-D [截圖前死亡0.7GB](http://ibb.co/nOSfJw) 我將在明天再次嘗試使用內存較大的更好的PC,但我沒有認爲,這將有助於 – SoptikHa

+0

我只是再次看到你的問題,你需要重新思考你在用你的數組/字典做什麼。爲什麼你需要一次保存如此多的數據?考慮以塊或即時處理數據,而不是等待RAM耗盡。 –

+0

謝謝,我會看看你寫的東西,並嘗試另一種方式來做到這一點,而不使用巨大的收藏 – SoptikHa

-2

您可以使用二維數組,如:

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

好吧,這是不是舒服與一維數組來工作。要解決這個問題,我建議你實現自定義類型,它在內部使用這個多維數組並實現IEnumerable。

+0

我已經做到了,如編輯1 – SoptikHa

相關問題