c#中關於大對象數組的一些心得


  在之前的一個課題中,曾經需要用到2W行*3W列的float類型矩陣(大約2.4G),由於無法創建大於2G的對象,當時采用了一些取巧的辦法回避了,並沒有拿出精力來研究一下這個問題。今天和公司的張哥(大牛級人物)重新談到了這個話題,在他的一些指引下感覺收獲頗深,發博記錄一下。

  首先,大家應該知道.net4.5以前,C#是無法創建內存大於2G的對象的。而且經測試,這僅僅是對64位平台的限制,在32位平台上,大約對象在1.47G左右的時候就會報異常了。至於其為什么這樣設計,大家可以參考博文:

http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx 。

  而在.net4.5以后,我們就可以通過修改配置的辦法來創建大對象,(.net4.5的一些新特性:http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx)具體操作如下圖:

  經過這樣的配置后,對象的大小將不再受2G的限制(有沒有上限沒測出來,也沒找到相關資料)。然而對於.net4.5以前的版本這么做就無能為力了。針對這個問題,我們可以用交錯數組進行解決。其形式為float[][](普通數組為float[,]),通過交錯數組我們可以很容易創建大於2G的對象,具體創建方式如下:

    float[][] f=new float[20000][];
            for (int i = 0; i < 20000; i++)
            {
                f[i] = new float[500000000];  //5億個float大約2G的內存。
            }

  此類數組在內存中具體的存儲方式還不得而知(感覺不會像普通數組一樣是一整塊連續的內存),其理論上最大應該可以擴充到20億*2個G的字節。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM