Memory .NET应用程序中的内存映射文件

Memory .NET应用程序中的内存映射文件,memory,file-io,Memory,File Io,我正在使用内存映射文件为ASP.NET应用程序缓存大量数据。目前,我正在使用global.asax事件打开文件,并获取一个内存映射文件句柄,我将其缓存在应用程序对象中。如果我将该句柄解引用到一个指针,并尝试在httphandler中缓存该指针,那么当我引用该指针时会出现保护异常,因此我将该句柄缓存到内存映射文件,并将其解引用到httphandler中的一个指针。这似乎工作得很好,速度也很快,所以我假设它只将文件加载到实际内存中一次。问题是,当负载增加时,我会同时运行多个httphandler实例

我正在使用内存映射文件为ASP.NET应用程序缓存大量数据。目前,我正在使用global.asax事件打开文件,并获取一个内存映射文件句柄,我将其缓存在应用程序对象中。如果我将该句柄解引用到一个指针,并尝试在httphandler中缓存该指针,那么当我引用该指针时会出现保护异常,因此我将该句柄缓存到内存映射文件,并将其解引用到httphandler中的一个指针。这似乎工作得很好,速度也很快,所以我假设它只将文件加载到实际内存中一次。问题是,当负载增加时,我会同时运行多个httphandler实例,每个实例似乎都将句柄解引用到不同的地址。这会很快耗尽地址空间。除了64位之外,还有什么方法可以强制托管代码在线程之间共享一个公共内存块?有没有更好的方法来完成我在这里要做的事情

提前感谢,


Brian

我想您可以从单例中提供指向内存映射文件的指针,对吗?

不,只要您尝试在托管代码中使用指针,就会出现保护冲突,因此CLR不愿意相信它不知道的内存是安全的。我想下一步是探索不安全的关键字,但我希望VB程序员可以使用它。如果这个想法是保持句柄并在代码中消除它的差异,由singleton保护,这将严重影响可伸缩性,因为我在大多数过程中都使用内存。作为对此的更新,我确实尝试过使用C和unsafe,但它在随机时间崩溃,内存保护异常。处理这个问题的正确方法似乎是每次使用句柄并映射到指针。通过只映射所需文件的部分,我克服了地址空间不足的问题。作为奖励,这允许文件的增长远远超过2GB地址空间的限制。布瑞恩