2011-12-18 78 views
3

我試圖讓一個數組保存所有可能的正整數,我嘗試了下面的代碼,並且它總是拋出內存異常。爲什麼我在嘗試製作int大小的int數組時出現OutOfMemoryException

private int[] AllIntegers() 
{ 
    int[] all = new int[int.MaxValue]; 

    for (int i = 0; i < int.MaxValue; i++) 
    { 
     all[i] = i; 
    } 

    return all; 
} 

我在做什麼錯了?或者這根本不可能?!

+1

這是什麼值? – 2011-12-18 11:20:58

+1

爲什麼你需要這麼大的陣列? – Oded 2011-12-18 11:21:26

+0

請記住,這樣的陣列將至少需要8GB RAM。你正在運行一個32位或64位系統? – nos 2011-12-18 11:22:16

回答

7

.NET對象大小有一個硬性上限,它們不能大於2千兆字節。即使在64位操作系統上。你的陣列遠遠超出了這個尺寸。

在32位操作系統上,您永遠無法接近該限制,可用的最大連續虛擬內存塊大約爲650兆字節。只有在啓動時,它纔會迅速下山。這是地址空間碎片的一個副作用,由地址空間中的代碼和堆的混合引起。只要每個分配的大小足夠小,您可以分配的內存總量就接近2千兆字節。不是你想要接近的東西,由於OOM導致的隨機程序故障很難處理。

4

Int.MaxValue = 2,147,483,647,sizeof(int) = 4,所以你需要8GB的內存來分配這個數組。異常表示您的操作系統無法分配這些內存。

== == UPDATE

MSDN

當您運行64位應用程序託管在64位Windows 操作系統上,可以創建不超過2物體千兆字節 (GB)。

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

+0

否。該錯誤意味着操作系統無法爲該進程分配太多內存。用戶可能安裝了8GB,但它們可能不是全部可尋址的。 – Oded 2011-12-18 11:21:55

+3

即使他有那麼多的內存,我相信沒有.NET對象可以大於2GB。 – 2011-12-18 11:22:14

+0

@Oded謝謝,我糾正了這一點 – kol 2011-12-18 11:24:08

0

您正在嘗試分配的存儲器約4 *(2^32 -1)字節。這正是8GB,可能比您的系統提供的更多,或者更確切地說您的流程可以分配的內容。

0

如果您使用的是32位操作系統(在64位操作系統上可能會更改),則整數爲4個字節(32位)。因此,int.MaxValue是2^31(2^31 signed,2^31 unsigned),因此您試圖分配一個2^31整數的數組。將每個字節乘以4個字節,即可獲得8589934592個字節,即8 GB字節。

0

正如別人所說,你不能同時在內存中保存所有的信息。要獲得所有自然數的列表,只需使用迭代器塊,該迭代器塊一次只能在內存中保存一個int,並加上方法狀態信息:

static void Main (string[] args) 
{ 
    foreach (int i in Program.NaturalNumbers()) 
    { 
     Console.WriteLine (i); 
    } 
} 

public static IEnumerable<int> NaturalNumbers() 
{ 
    for (int i = 0; i <= int.MaxValue; i++) 
    { 
     yield return i; 
    } 
} 
相關問題