讓.Net 應用程序突破2G的內存訪問限制(2)_.Net教程
推薦:解讀.NET 2.0中Hashtable快速查找的方法一般來說我們都是用 Hashtable 的 ContainsKey 方法來查找 Hashtable 中是否存在某個鍵值然后讀取他,但是這個方法并不是效率最好的方法。比較好的方法是直接讀取鍵值然后判斷這個對象是否
由于需要鎖定物理內存,所以運行AWE功能的程序,必須要具備鎖定內存的權限,系統管理員帳號是沒有這個權限的,只有 System帳號有這個權限。當然你也可以在本地安全設置中指定某個帳號擁有這個權限。方法如下:
gpedit.msc ->Windows Settings->Security Settings->Local Policies->User Rights Assignment->Lock pages in memory
談完鎖定內存的問題,我們再看看上面那個圖,我們會發現雖然AWE允許訪問最多64G的內存,但這64G內存是被AWE映射到一個32位的用戶模式下的內存地址中去的,也就是說通常情況下,我們最多可以同時訪問64G內存中的2G內存 (如果配置了/3G開關,可以同時訪問最多16G內存中的3G內存),如果要訪問整個64G的內存,我們需要將一些不訪問的內存取消映射,這樣可以空出足夠的用戶模式下的虛擬內存地址來訪問我們需要訪問的內存。因此我封裝的類中添加了Map和UnMap兩個方法,讓調用者可以根據實際情況來決定映射和去映射。2G的32位虛擬內存地址對于我們來是是如此的寶貴,調用者在貪婪的消耗大量內存時一定要注意節約這個資源。
談完這些東西,下面讓我們結合代碼來看看在.Net 下如何來操作AWE 內存吧。
為了方便.Net 程序員訪問AWE內存,我封裝了一個AweStream類,這個類繼承自Stream類。.Net程序員可以像操作普通的MemoryStream流那樣操作AWE內存。同時我還為那些對效率要求非?量痰恼{用者提供了一個通過指針訪問AWE內存的方法。
調用示例如下:注意必須在構造函數中指明申請的AWE內存的大小。
以下為引用的內容:
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內存 windows 2003 企業版的環境中做了測試,申請內存到5G以上沒有任何問題。
下面再看看如何來申請AWE內存
下面的AweStream構造函數完成了對AWE內存的申請過程。
整個申請過程分為下面幾步
分享:解讀26個ASP.Net開發新手的常見問題一位ASP.net初學者學習過程中整理的備忘錄,包括“打開新的窗口并傳送參數,為按鈕添加對話框,刪除表格選定記錄,刪除表格記錄警告”等等常見問題的解決方法。 1. 打開新的窗
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-讓.Net 應用程序突破2G的內存訪問限制(2)
。