内存操作类(共享映射文件 MemoryMappedFile)

原创 2017年05月26日 12:15:57

需要完善的地方:

一个内存对象占地1G,资源浪费太严重。动态大小更合理,每次重新创建有可能多个进程之间冲突。

IIS和winform之间存在应用权限隔离,并且iis本身权限较低,涉及系统操作会被拒绝,提权有隐患。

场景有限,效率感人,仅供参考,redis大法好。

    /// <summary>
    /// 首4个字节为文件长度,该类存对应内存区域所存放的数据不能超过1G。内存区域不是私有独占对象。
    /// </summary>
    class memobj
    {
        MemoryMappedFile mmf;
        MemoryMappedViewStream mmvs;
        string name;
        uint maxlen = (1<<30) + 4;


        /// <summary>
        /// 创建一个memobj对象,获取/创建name属性对应的内存映射文件,并写入内容。如果文件已存在,将覆盖。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="name">memobj对象名称,私有</param>
        /// <param name="content">写入内存的内容</param>
        public memobj(string name,byte[] content)
        {
            this.name = name;
            mmf = MemoryMappedFile.CreateOrOpen(name, maxlen, MemoryMappedFileAccess.ReadWrite);
            mmvs = mmf.CreateViewStream();
            if (content.Length >= maxlen)
            {
                throw new OutOfMemoryException();
            }
            else
            {
                WriteContent(content);
            }
        }


        /// <summary>
        /// 创建一个memobj对象,获取/创建name属性对应的内存映射文件。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="name">memobj对象名称</param>
        public memobj(string name)
        {
            this.name = name;
            mmf = MemoryMappedFile.CreateOrOpen(name, maxlen, MemoryMappedFileAccess.ReadWrite);
            mmvs = mmf.CreateViewStream();
        }


        /// <summary>
        /// 将数据长度写入内存区域的首4字节。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="Length"></param>
        private void WriteLength(uint Length)
        {
            byte[] ret = new byte[4];
            ret[0] = Convert.ToByte((Length >> 24) % 256);
            ret[1] = Convert.ToByte((Length >> 16) % 256);
            ret[2] = Convert.ToByte((Length >> 8) % 256);
            ret[3] = Convert.ToByte(Length   % 256);
            mmvs.Position = 0;
            mmvs.Write(ret, 0, 4);
        }


        /// <summary>
        /// 获取内存数据长度,通过前4个字节计算,不存在Length属性。内存区域不是私有独占对象。
        /// </summary>
        /// <returns></returns>
        public int Length()
        {
            mmvs.Position = 0;
            byte[] ret = new byte[4];
            mmvs.Read(ret, 0, 4);
            return (ret[0] << 24) + (ret[1] << 16) + (ret[2]<<8) + ret[3];
        }


        /// <summary>
        /// 写入数据长度到内存区域首4字节。内存区域不是私有独占对象。
        /// </summary>
        /// <param name="content"></param>
        public void WriteContent(byte[] content)
        {
            mmvs.Position = 0;
            WriteLength((uint)content.Length);
            mmvs.Write(content, 0, content.Length);
        }


        /// <summary>
        /// 从内存区域首4字节计算数据长度并读出内存数据。内存区域不是私有独占对象。
        /// </summary>
        /// <returns></returns>
        public byte[] Read()
        {
            int bytLength = Length();
            byte[] ret = new byte[bytLength];
            mmvs.Position = 4;
            mmvs.Read(ret, 0, bytLength);
            return ret;
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

.NET 4.0中使用内存映射文件实现进程通讯

.NET 4.0系列之使用内存映射文件实现进程通讯************************************************************************版权声...
  • bitfan
  • bitfan
  • 2009年08月12日 14:51
  • 7480

MemoryMappedFile 内存映射+ Parallel 并行分块 读写大文件

private static void SpiltFile(string srcFile, int portionSize) { string savedPat...

linux 时间戳转换/dmesg 时间转换

摘要:linux时光戳转换 1. 将日期转换成时光戳 $date %s -d 04/24/2014 15:30:00 1398324600 2. 将时光戳转换成日期 $date -d @1398324...
  • sufwei
  • sufwei
  • 2016年01月31日 11:26
  • 732

Linux_利用fdisk建立swap分区

这种情况可以针对没有建立swap或者swap空间比较小。 1、对硬盘进行分区。 #fdisk  /dev/sda Command (m for help): p Disk /dev/sda: ...
  • sxtobj
  • sxtobj
  • 2015年02月06日 17:17
  • 1515

vc内存映射文件操作.doc

  • 2010年03月09日 19:35
  • 13KB
  • 下载

内存映射文件操作相关

// ATS4DemoDlg.h : header file // #if !defined(AFX_ATS4DEMODLG_H__32E6642D_5F67_4613_B312_9C160914...
  • lvcayu
  • lvcayu
  • 2011年04月15日 12:08
  • 504

映射文件操作封装类

  • 2017年10月09日 14:27
  • 9KB
  • 下载

映射文件到内存,像操作内存一样方便读写文件——MemFile

编码中操作文件是常有的事,本文封装了一种不一样的读写文件方式,通过映射文件可以想操作内存一样方便的读写文件。 方法解释: Attach:关联已存在的文件并映射到内存,不存在返回NULL; Det...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存操作类(共享映射文件 MemoryMappedFile)
举报原因:
原因补充:

(最多只允许输入30个字)