内存映射文件.NET

时间:2008-12-10 19:02:51

标签: c# .net asp.net memory-mapped-files

我有一个项目,它需要访问ASP.NET中的大量专有数据。这是通过在共享内存中加载数据在Linux / PHP上完成的。我想知道是否尝试使用内存映射文件是可行的方法,或者是否有更好的方法可以提供更好的.NET支持。我正在考虑使用数据缓存,但不确定缓存中保存的数据大小的所有缺陷。

4 个答案:

答案 0 :(得分:30)

我知道这有点晚了,但.NET 4.0框架现在支持开箱即用的内存映射文件:

http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx

答案 1 :(得分:10)

如果您正在为C#寻找内存映射库,请查看Tomas Restrepo's filemap包装器。它是根据LGPL许可的。

答案 2 :(得分:3)

内存映射文件可以在拥有大量数据时使用,并且不希望产生跨进程边界编组的成本。我把它用于类似的目的。您需要对.NET中的不安全和固定内存概念相当熟悉才能利用MMF。 Apparently,企业库的缓存块包含包装底层C#API的代码。我在别处看到过至少一个其他实现。

如果您可以忍受编组成本,那么使用某种.NET远程处理解决方案可能更容易也更优雅。

答案 3 :(得分:1)

您可能只想将其放入Cache []对象中。您可以根据实际文件设置缓存过期。然后,无论何时修改实际文件,缓存中的对象的内容都将为null,您可以重新加载它。如果您处理大量字节,这可能不合适。

byte[] fileBytes = Cache["fileBytes"];
if (null == fileBytes) {
   // reload the file and add it to the cache.
   string fileLocation = Server.MapPath("path/to/file.txt");
   // Just a same of some bytes.
   fileBytes = new byte[10];
   Cache.Insert(fileLocation, fileBytes, new System.Web.Caching.CacheDependency(fileLocation));
}

我想我没有关于缓存和大量数据的性能特征的具体答案。 http://www.alachisoft.com/ncache/asp-net-cache.html表示您需要在应用程序和缓存之间共享2到3个缓存空间。