最近一直为文件内存映射发愁,整个两周一直折腾这个东西。在64位系统和32位系统还要针对内存的高低位进行计算。好麻烦。。还是没搞定

偶然从MSDN上发现.NET 4.0把内存文件映射加到了.NET类库中。。好像方便了很多啊。。比用C#直接调用WINDOWS API方便多了。所以

这个必须果断记录之。。。项目马上要用,为了加强内存数据交换的效率。。这个。。。必须啊。。

任务

使用的方法或属性

从磁盘上的文件中获取表示持久内存映射文件的 MemoryMappedFile 对象。

MemoryMappedFile.CreateFromFile 方法。

获取表示非持久内存映射文件(与磁盘上的文件不关联)的 MemoryMappedFile 对象。

MemoryMappedFile.CreateNew 方法。

- 或 -

MemoryMappedFile.CreateOrOpen 方法。

获取现有内存映射文件(持久文件或非持久文件)的 MemoryMappedFile 对象。

MemoryMappedFile.OpenExisting 方法。

获取针对内存映射文件的顺序访问视图的 UnmanagedMemoryStream 对象。

MemoryMappedFile.CreateViewStream 方法。

获取针对内存映射文件的随机访问视图的 UnmanagedMemoryAccessor 对象。

MemoryMappedFile.CreateViewAccessor 方法。

获取要用于非托管代码的 SafeMemoryMappedViewHandle 对象。

MemoryMappedFile.SafeMemoryMappedFileHandle 属性。

- 或 -

MemoryMappedViewAccessor.SafeMemoryMappedViewHandle 属性。

- 或 -

MemoryMappedViewStream.SafeMemoryMappedViewHandle 属性。

将内存分配推迟到创建视图后进行(仅限于非持久文件)。

(若要确定当前系统页大小,请使用 Environment.SystemPageSize 属性。)

带 MemoryMappedFileOptions.DelayAllocatePages 值的 CreateNew 方法。

- 或 -

将 MemoryMappedFileOptions 枚举作为参数的 CreateOrOpen 方法。

持久文件内存映射:

CreateFromFile 方法基于磁盘上的现有文件创建一个内存映射文件。


 1 using System;
 2 using System.IO;
 3 using System.IO.MemoryMappedFiles;
 4 using System.Runtime.InteropServices;
 5 
 6 class Program
 7 {
 8     static void Main(string[] args)
 9     {
10         long offset = 0x10000000; // 256 megabytes
11         long length = 0x20000000; // 512 megabytes
12 
13         // Create the memory-mapped file.
14         using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
15         {
16             // Create a random access view, from the 256th megabyte (the offset)
17             // to the 768th megabyte (the offset plus length).
18             using (var accessor = mmf.CreateViewAccessor(offset, length))
19             {
20                 int colorSize = Marshal.SizeOf(typeof(MyColor));
21                 MyColor color;
22 
23                 // Make changes to the view.
24                 for (long i = 0; i < length; i += colorSize)
25                 {
26                     accessor.Read(i, out color);
27                     color.Brighten(10);
28                     accessor.Write(i, ref color);
29                 }
30             }
31         }
32     }
33 }
34 
35 public struct MyColor
36 {
37     public short Red;
38     public short Green;
39     public short Blue;
40     public short Alpha;
41 
42     // Make the view brigher.
43     public void Brighten(short value)
44     {
45         Red = (short)Math.Min(short.MaxValue, (int)Red + value);
46         Green = (short)Math.Min(short.MaxValue, (int)Green + value);
47         Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
48         Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
49     }
50 }

非持久文件内存映射:

CreateNew 和 CreateOrOpen 方法创建一个未映射到磁盘上的现有文件的内存映射文件。


 1 using System;
 2 using System.IO;
 3 using System.IO.MemoryMappedFiles;
 4 using System.Threading;
 5 
 6 class Program
 7 {
 8     // Process A:
 9     static void Main(string[] args)
10     {
11         using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
12         {
13             bool mutexCreated;
14             Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
15             using (MemoryMappedViewStream stream = mmf.CreateViewStream())
16             {
17                 BinaryWriter writer = new BinaryWriter(stream);
18                 writer.Write(1);
19             }
20             mutex.ReleaseMutex();
21 
22             Console.WriteLine("Start Process B and press ENTER to continue.");
23             Console.ReadLine();
24 
25             Console.WriteLine("Start Process C and press ENTER to continue.");
26             Console.ReadLine();
27 
28             mutex.WaitOne();
29             using (MemoryMappedViewStream stream = mmf.CreateViewStream())
30             {
31                 BinaryReader reader = new BinaryReader(stream);
32                 Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
33                 Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
34                 Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
35             }
36             mutex.ReleaseMutex();
37         }
38     }

.NET Framework自带的文件内存映射类的更多相关文章

  1. c++/MFC 封装好的文件内存映射类

    整理日: 2015年2月16日 首先介绍内存映射文件操作------函数的用法以及先后执行顺序 // 第一步:创建文件 HANDLE hFile = CreateFileForMapping(_T(& ...

  2. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...

  3. MMAP文件内存映射

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. 使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

  5. hibernate 的映射文件快速生成:使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

  6. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  7. cocos2d 文件系统使用文件内存映射性能对比

    //cocos 修改代码 ..... //性能测试代码 extern "C" { #include <time.h> #include <stdlib.h> ...

  8. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

  9. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

随机推荐

  1. 【转】STM32和ARM的区别

    转自:http://www.cnblogs.com/nuc-boy/archive/2012/09/11/2680157.html 这个问题大概2009年的时候很多人就在问,请看09年的时候大家给出的 ...

  2. Java7和8在虚拟机上的差异:Perm Generation vs. Metaspace

  3. 使用telnet模拟http请求

    HTTP 首先我们需要知道http报文是由一系列的字符串组成的.然后我们来了解具体的相关事项. 方法 HTTP支持几种不同形式的请求命令,这些命令就被称为HTTP方法.每个HTTP请求报文都包含一个方 ...

  4. VS Code 的常用快捷键和插件

    VS Code 的常用快捷键和插件 一.vs code 的常用快捷键 1.注释: a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] ...

  5. [转帖]从 2G 到 5G,手机上网话语权的三次改变

    从 2G 到 5G,手机上网话语权的三次改变 美国第一大电信运营商 Verizon 公司的 CEO Hans Vestberg 手持一部 iPad,屏幕上显示俯瞰地面的飞行地图.400 多公里外的洛杉 ...

  6. 软件工程_8th weeks

    第八周PSP 个人时间管理 由于本周主要在做论文实验,除了学习时间外有一些零散的时间也在思考代码的书写以及论文实验的流程,但是这些零散的时间并没有在总的表记录,所以想问一下老师,像这种平时零散思考的时 ...

  7. Python 2和Python 3的编码问题

    在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型.要输入Unicode字符串字面量,要在第一个引号前加 ...

  8. 关于flask 上直接使用py.test测试框架进行测试

    这个周末基本上都在研究这玩意儿中度过了,虽然效率不高,英文文档看得晕头转向,但是好歹弄出来了 有个结果测试也通过了现在粗略总结一下有时间补上更多详细的例子. 首先使用py.test测试框架,可以做最简 ...

  9. jvm学习二:类加载器

    前一节详细的聊了一下类的加载过程,本节聊一聊类的加载工具,类加载器  ---  ClassLoader 本想自己写的,查资料的时候查到一篇大神的文章,写的十分详细 大家直接过去看吧http://blo ...

  10. windows编程按小时生成日志文件

    这是一个简单的日志记录方法,为了避免单个日志文件过大,所以每个小时生成一个新的日志文件 注意:g_pLogPath 可以带路径,但是必须手动创建好路径,保证目录存在.而且要详细到log文件名,不能带后 ...