【发布时间】:2009-04-07 18:56:24
【问题描述】:
我正在使用内存映射文件为 ASP.NET 应用程序缓存大量数据。目前我正在使用 global.asax 事件打开文件并获取我缓存在应用程序对象中的内存映射文件句柄。如果我将该句柄取消引用到一个指针并尝试在我的 httphandler 中缓存该指针,当我引用该指针时我会得到一个保护异常,因此我将缓存到内存映射文件的句柄并将其取消引用到我的 httphandler 中的指针。这似乎工作正常并且非常快,所以我假设它只是一次将文件加载到真实内存中。问题是,当负载增加时,我会同时运行多个 httphandler 实例,并且每个实例似乎都将句柄取消引用到不同的地址。这会导致很快耗尽地址空间。没有达到 64 位,有没有办法强制托管代码在线程之间共享一块公共内存?有没有更好的方法来完成我在这里尝试做的事情?
提前致谢,
布赖恩
【问题讨论】:
-
作为对此的更新,我确实尝试使用 C# 并且不安全,但它会随机崩溃并出现内存保护异常。处理这个问题的正确方法似乎是每次使用时都使用句柄并映射到指针。通过仅映射我需要的文件部分,我克服了地址空间不足的问题。作为奖励,这允许文件的增长远远超出 2GB 地址空间的限制。布赖恩