内存操作类(共享映射文件 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;
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

vc内存映射文件操作.doc

  • 2010-03-09 19:35
  • 13KB
  • 下载

内存映射文件操作相关

// ATS4DemoDlg.h : header file // #if !defined(AFX_ATS4DEMODLG_H__32E6642D_5F67_4613_B312_9C160914...

共享内存 -- 映射文件

  • 2014-05-23 15:58
  • 4.39MB
  • 下载

内存映射文件进程间共享内存

内存映射文件进程间共享内存   内存映射文件的另一个功能是在进程间共享数据,它提供了不同进程共享内存的一个有效 且简单的方法。后面的许多例子都要用到共享内存。 ...

映射文件操作封装类

System.IO之内存映射文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数。这种方法能够很好的应用在需要频繁处理一个文...

内存映射文件

  • 2015-04-11 11:19
  • 5.75MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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