iT邦幫忙

4

.Net 4.5 + x64 Windows系統,解放CLR 2GB限制

以往,在.Net 4.5出現之前,
不管是array還是List<T>,如果沒有妥善使用以及沒有限制地放置大量的物件與資料
很容易就會拿到一張OutOfMemory爆漿許可證。
DataSet、DataTable的資料儲存也經常因為SELECT * FROM....再次領到一張
沒辦法...誰叫這是CLR本身的一個極限

.Net 4.5問世之後,終於有機會可以突破這樣的2GB魔咒讚
以往,在.Net 4.5出現之前,
不管是array還是List<T>,如果沒有妥善使用以及沒有限制地放置大量的物件與資料
很容易就會拿到一張OutOfMemory爆漿許可證。
DataSet、DataTable的資料儲存也經常因為SELECT * FROM....再次領到一張
沒辦法...誰叫這是CLR本身的一個極限

都要苦口婆心地一而再提醒程式設計人員:
請好好地做好條件搜尋....
果不其然,今天一名junior...領到了一張,
急急忙忙跑來說:我們的server是不是可以加個幾十GB的記憶體?因為OutOfMemory...
L走過去看了一下Error Message....說:加個幾十GB如果可以解決你的問題,那就不是問題;現在的問題在於,就算再給你幾百GB也沒用...

原因就出在.net 4.0之前的CLR,array只能用到最多2GB的記憶體空間
即使放在x64的Windows上也是一樣

.Net 4.5之後,可以在config檔裡頭
加上這麼一段敘述:

<gcAllowVeryLargeObjects enabled="true" />

這個設定,可以允許array使用大於2GB的記憶體空間,當然,這僅限於搭配x64的系統使用。
設定值請放在config檔裡頭的<runtime></runtime>區段裡頭

最後,還是得叮嚀一下~~
請記住:
沒有任何系統是允許無限制地亂搞系統資源的!
請不要濫用萬用字元(SELECT * FROM....),只拿你需要用的欄位與資料列!
請好好限制資料查詢與暫存!

請珍惜系統資源~


2 則留言

0
海綿寶寶
iT邦超人 1 級 ‧ 2014-10-06 11:31:23

wiselou提到:
果不其然,今天一名junior...領到了一張,
急急忙忙跑來說:我們的server是不是可以加個幾十GB的記憶體?

結果晚上他上 FB 留言:
今天我才不過要加幾十 GB 的記憶體
公司的 senior 就囉哩八嗦
拜託,才幾十 GB
我家裡的硬碟都幾 T 了耶
哈哈

驚哭

iT邦幫忙MVPantijava提到:
我家裡的Memory都幾 T 了耶

驚驚驚
驚驚
驚

0
summertw
iT邦好手 1 級 ‧ 2014-10-06 11:50:16

我想,這是一個很重要的迷失...
現在因為硬體限制有了很大的突破,所以寫程式時,總希望給記憶體人家有多多益善的感覺..
但事實並非如此...
16Bit,Offset 4Bit後,定址剛好是1024,32Bit後,是否還是用Offset 4Bit的方式來定址,我老早就已沒有再去研究了..
但是,不管是用什麼方法去定址,資料載入量永遠都會受到約束,即使已突破2GB的約束,還是要很省著用才是..
用越多的記憶體去載入更多的資料,只會降低機器的使用效能,同時也會降低整體網路的使用效能,更會造成伺服器的瞬間負載...
奉勸樓主應慎重考量程式的撰寫,整體效能才是你的最佳選項,而不是加記憶體或是你的硬碟有多少T來考量了...

臉紅

我要留言

立即登入留言