最近一直为文件内存映射发愁,整个两周一直折腾这个东西。在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. HDU 2032 杨辉三角

    http://acm.hdu.edu.cn/showproblem.php?pid=2032 Problem Description 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考 ...

  2. PAT 1049 数列的片段和

    https://pintia.cn/problem-sets/994805260223102976/problems/994805275792359424 给定一个正数数列,我们可以从中截取任意的连续 ...

  3. Activiti启动某个流程失败,页面报500

    现象:Activiti启动某个流程失败,页面报500,错误日志如下. 2017-06-19 10:50:09 [org.activiti.engine.impl.interceptor.Command ...

  4. C++拷贝控制

    一.拷贝控制操作 ​ 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...

  5. [转载] Oracle在windows下面的自动备份以及删除今天的脚本..

    @echo off echo ================================================ echo Windows环境下Oracle数据库的自动备份脚本 echo ...

  6. matplotlib绘图

    fig = plt.figure() ax=plt.gca() timeList = np.array(timeList) timeList=timeList*100 timeList1 = np.a ...

  7. 关于MySQL中添加数据的两种方法

    下面介绍两种执行SQL命令的方法,并作出相应地总结,第一种介绍一种常规用法,下面进行做简要地分析,首先我们需要执行打开数据库操作首先创建一个MySqlConnection对象,在其构造函数中传入一个连 ...

  8. mysql问题处理积累

    1.mysql errors:message from server: "Host 'xxx' is blocked because of many connection errors; u ...

  9. Nginx FIND_CONFIG阶段

    Location 指令 syntax : location [=|~|~*|^~]  uri {...} @name {....} default: -- context: server,locati ...

  10. float 、double 加减乘除出现小数位多出的问题

    /** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...