最近一直为文件内存映射发愁,整个两周一直折腾这个东西。在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. Linux查询用户和组的命令

    root@PC-RENGUOQIANG:~# cat /etc/passwd root:x:::root:/root:/bin/bash daemon:x:::daemon:/usr/sbin:/us ...

  2. hadoop集群故障排除

    故障一:某个datanode节点无法启动 我是以用户名centos安装和搭建了一个测试用的hadoop集群环境,也配置好了有关的权限,所有者.所属组都配成centos:centos [故障现象] 名称 ...

  3. matplotlib之直接保存图片

    自动保存图表:pyplot.savefig('D:\\pic.png'),替代了 pyplot.show(). # 使用matplotlib.pyplot.scatter绘制散点 import mat ...

  4. 美国运营商推送假5G图标:用户当场蒙圈了

    面对5G大潮,大家都想“争当第一”.美国运营商AT&T想出奇招,打算玩一把“障眼法”. 据外媒报道,AT&T的用户从明年开始会在手机右上角看到“5G E”的图标.当然,这并不是他们的手 ...

  5. 学习Spring Boot:(二十八)Spring Security 权限认证

    前言 主要实现 Spring Security 的安全认证,结合 RESTful API 的风格,使用无状态的环境. 主要实现是通过请求的 URL ,通过过滤器来做不同的授权策略操作,为该请求提供某个 ...

  6. NOIP2018退役记

    退役失败*1. md可能只有一次啊.

  7. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  8. numpy 从入门到遗忘

    不常用的函数总是遗忘,很是困扰啊.于是痛下时间,做一个系统的总结,纯原创,都是些实际项目中常用的函数和方法,当然还有一些这边也是没有记录的,因为我在实际数据处理过程中也没有遇到过(如字符串处理等等). ...

  9. DownloadProvider 源码详细分析

    DownloadProvider 简介 DownloadProvider 是Android提供的DownloadManager的增强版,亮点是支持断点下载,提供了“开始下载”,“暂停下载”,“重新下载 ...

  10. install ubuntu env

    install ubuntu1, mysql serversudo apt-get install mysql-server2, ssh sudo apt-get install openssh-se ...