让.Net 应用程序突破2G的内存访问限制(2)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:解读.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. 打开新的窗

来源:模板无忧//所属分类:.Net教程/更新时间:2008-12-05
相关.Net教程