【问题标题】:Memory mapped files in .NET app.NET 应用程序中的内存映射文件
【发布时间】:2009-04-07 18:56:24
【问题描述】:

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

提前致谢,

布赖恩

【问题讨论】:

  • 作为对此的更新,我确实尝试使用 C# 并且不安全,但它会随机崩溃并出现内存保护异常。处理这个问题的正确方法似乎是每次使用时都使用句柄​​并映射到指针。通过仅映射我需要的文件部分,我克服了地址空间不足的问题。作为奖励,这允许文件的增长远远超出 2GB 地址空间的限制。布赖恩

标签: memory file-io


【解决方案1】:

我猜你可以从单例中提供指向内存映射文件的指针,对吧?

【讨论】:

  • 不,一旦您尝试在托管代码中使用指针,您就会遇到保护冲突,因此 CLR 不乐意相信它不知道的内存可以安全使用。我想下一步是探索 UNSAFE 关键字,但我希望让 VB 程序员可以使用它。
  • 如果想法是保留句柄并在受单例保护的代码中取消引用它,那么当我在大部分进程中使用内存时,它会严重影响可伸缩性。
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多