2015-06-18 82 views
5

在我追求的素數,我已經問過這個問題:Can't create huge arrays導致我創造我自己的類基於陣列的字典假冒陣列...:private Dictionary<int, Array> arrays = new Dictionary<int, Array>();創造巨大的字典

我可以知道創造了許多布爾的假陣列(如10 000 000 000)使用下面的代碼:

public class CustomArray 
{ 
    private Dictionary<int, Array> arrays = new Dictionary<int, Array>(); 

    public CustomArray(ulong lenght) 
    { 
     int i = 0; 
     while (lenght > 0x7FFFFFC7) 
     { 
      lenght -= 0x7FFFFFC7; 
      arrays[i] = new bool[0x7FFFFFC7]; 
      i++; 
     } 
     arrays[i] = new bool[lenght]; 
    } 
} 

但只要我問100 000 000 000元素CustomArray的崩潰。它適用於25次第一次迭代(我的字典包含25個0x7FFFFFC7元素數組),但隨後崩潰了一個OutOfMemory異常。作爲其餘部分,我有16GB內存,VS2013,程序編譯爲64位,我啓用了gcAllowVeryLargeObjects選項,我在任務管理器中看不到任何內存峯值。


如何避免此錯誤?

+0

爲什麼詞典不是所有的東西?鋸齒陣不會更合適嗎? – Luaan

+0

@Luaan隨機選擇,我在字典的心情... –

+3

也bool不是一種有效的信息存儲類型。你可以簡單地將64個布爾值存儲在一個ulong(8字節)而不是64個布爾數組(64字節)中。 – Andrew

回答

7

100000000000 bools表示〜93 GB的內存。您只有@ 50 GB(包括默認分配的虛擬內存)。

將它們存儲爲位(而不是字節),會使您降至〜12GB。

看看System.Collection.BitArray

+0

看起來不錯 - 我會測試它 –