讓.Net 應(yīng)用程序突破2G的內(nèi)存訪問限制(2)_.Net教程
推薦:解讀.NET 2.0中Hashtable快速查找的方法一般來說我們都是用 Hashtable 的 ContainsKey 方法來查找 Hashtable 中是否存在某個鍵值然后讀取他,但是這個方法并不是效率最好的方法。比較好的方法是直接讀取鍵值然后判斷這個對象是否
由于需要鎖定物理內(nèi)存,所以運行AWE功能的程序,必須要具備鎖定內(nèi)存的權(quán)限,系統(tǒng)管理員帳號是沒有這個權(quán)限的,只有 System帳號有這個權(quán)限。當(dāng)然你也可以在本地安全設(shè)置中指定某個帳號擁有這個權(quán)限。方法如下:
gpedit.msc ->Windows Settings->Security Settings->Local Policies->User Rights Assignment->Lock pages in memory
談完鎖定內(nèi)存的問題,我們再看看上面那個圖,我們會發(fā)現(xiàn)雖然AWE允許訪問最多64G的內(nèi)存,但這64G內(nèi)存是被AWE映射到一個32位的用戶模式下的內(nèi)存地址中去的,也就是說通常情況下,我們最多可以同時訪問64G內(nèi)存中的2G內(nèi)存 (如果配置了/3G開關(guān),可以同時訪問最多16G內(nèi)存中的3G內(nèi)存),如果要訪問整個64G的內(nèi)存,我們需要將一些不訪問的內(nèi)存取消映射,這樣可以空出足夠的用戶模式下的虛擬內(nèi)存地址來訪問我們需要訪問的內(nèi)存。因此我封裝的類中添加了Map和UnMap兩個方法,讓調(diào)用者可以根據(jù)實際情況來決定映射和去映射。2G的32位虛擬內(nèi)存地址對于我們來是是如此的寶貴,調(diào)用者在貪婪的消耗大量內(nèi)存時一定要注意節(jié)約這個資源。
談完這些東西,下面讓我們結(jié)合代碼來看看在.Net 下如何來操作AWE 內(nèi)存吧。
為了方便.Net 程序員訪問AWE內(nèi)存,我封裝了一個AweStream類,這個類繼承自Stream類。.Net程序員可以像操作普通的MemoryStream流那樣操作AWE內(nèi)存。同時我還為那些對效率要求非�?量痰恼{(diào)用者提供了一個通過指針訪問AWE內(nèi)存的方法。
調(diào)用示例如下:注意必須在構(gòu)造函數(shù)中指明申請的AWE內(nèi)存的大小。
以下為引用的內(nèi)容:
byte[] inputBuffer = new byte[1024];
Stopwatch stopWatch = new Stopwatch();
using (AweStream.AweStream aweStream = new AweStream.AweStream(1024 * 1024 * 100))
{
//Map
aweStream.Map();
stopWatch.Start();
//Copy one bytes
//Use unsafe pointer
for (int i = 0; i < 1024 * 1024 * 100; i )
{
unsafe
{
aweStream.LpMemory[i] = 1;
}
}
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
aweStream.Position = 0;
//Block copy
stopWatch.Reset();
stopWatch.Start();
for (int i = 0; i < 1024 * 100; i )
{
unsafe
{
aweStream.Write(inputBuffer, 0, 1024);
}
}
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
//UnMap
aweStream.UnMap();
}
我在 6G內(nèi)存 windows 2003 企業(yè)版的環(huán)境中做了測試,申請內(nèi)存到5G以上沒有任何問題。
下面再看看如何來申請AWE內(nèi)存
下面的AweStream構(gòu)造函數(shù)完成了對AWE內(nèi)存的申請過程。
整個申請過程分為下面幾步
分享:解讀26個ASP.Net開發(fā)新手的常見問題一位ASP.net初學(xué)者學(xué)習(xí)過程中整理的備忘錄,包括“打開新的窗口并傳送參數(shù),為按鈕添加對話框,刪除表格選定記錄,刪除表格記錄警告”等等常見問題的解決方法。 1. 打開新的窗
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- .net 框架程序的設(shè)計
- 讓ASP.NET程序自動為URL加上超級鏈接
- 用XML JSP實現(xiàn)網(wǎng)頁內(nèi)容動態(tài)顯示的方案
- C#中遍歷各類數(shù)據(jù)集合的方法總結(jié)
- 談?wù)凥tmlControl與WebControl的區(qū)別與用途
- ASP.NET學(xué)習(xí)篇(4)——服務(wù)器端的控件
- 關(guān)于DDD:管理工作單元實例的兩種模式的使用方法
- 基于自定義Unity生存期模型PerCallContextLifeTimeManager的問題
- FCKeditor 2.6在ASP.NET中的配置方法
- 專家詳解:復(fù)雜表達式的執(zhí)行步驟
- 相關(guān)鏈接:
- 教程說明:
.Net教程-讓.Net 應(yīng)用程序突破2G的內(nèi)存訪問限制(2)
。