内存操作类(共享映射文件 MemoryMappedFile)
来源:互联网 发布:七天网络app在哪下载 编辑:程序博客网 时间:2024/06/07 10:52
需要完善的地方:
一个内存对象占地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; } }
阅读全文
0 0
- 内存操作类(共享映射文件 MemoryMappedFile)
- MemoryMappedFile 内存映射+ Parallel 并行分块 读写大文件
- 封装:内存镜像文件(MemoryMappedFile)封装,一维二维三维定点访问
- 共享内存操作,mmap映射
- 通过文件映射共享内存
- Java文件映射共享内存
- Java文件映射共享内存
- 共享内存(内存映射)
- c# 内存共享、内存映射文件
- 内存映射文件进程间共享内存
- 内存映射文件进程间共享内存
- 内存映射文件实现共享内存
- c#实现内存映射文件共享内存
- 使用内存文件映射实现共享内存
- 进程间通讯(五)--共享内存(文件映射)
- 数据共享,内存映射文件和虚拟内存,共享内存
- 内存映射文件 ---大数据量共享
- 文件映射,共享内存的实现
- 如何自动生成文本摘要
- RSA非对称加密工具JAVA实现
- 浅谈信号量
- TF/04_Support_Vector_Machines/06_Implementing_Multiclass_SVMs
- 一周入门Kotlin(二)
- 内存操作类(共享映射文件 MemoryMappedFile)
- GCD XOR UVA
- 跟着笨叔叔一起省电
- Java基础知识总结
- Echarts柱状图formatter函数的使用和页面显示的bug解决
- 极具个性化的【自定义日历】(预热篇)—超详细,记录你的学习计划与完成情况
- VR教育进入新加坡课堂
- 安卓之旅第十一站--简易新闻客户端
- Android环境杂记