MemoryMappedFile的初级应用
public class SyncMemoryList<T>: SyncList<T>, IDisposable
{
private MemoryCache<T> _memoryCache = new MemoryCache<T>(); public new void Add(T item)
{
string json = $"{ToJson(item)}\n";
WriteCache(json); base.Add(item);
} private string ToJson(T item)
{
Type type = typeof(T);
if (type.IsClass)
return JsonExtensions.ToJson(item);
else
return item.ToString();
} private void WriteCache(string text)
{
byte[] bytes = Encoding.UTF8.GetBytes(text);
if (_memoryCache.IsAllowWrite(bytes.Length))
{
_memoryCache.Write(bytes);
}
else
{
_memoryCache.Dispose();
_memoryCache = new MemoryCache<T>();
_memoryCache.Write(bytes);
}
} #region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用 protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
} _memoryCache?.Dispose();
disposedValue = true;
}
} // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~SyncMemoryList() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// } // 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
} internal class MemoryCache<T>:IDisposable
{
private readonly MemoryMappedFile _memoryMapped = null;
private readonly MemoryMappedViewStream _stream = null;
private static readonly long _defaultSize = * ;
private readonly long _capatity = ;
public MemoryCache()
{
string mapname = $"{typeof(T).Name}";
string fileName = $"{typeof(T).Name}_{DateTime.Now:yyyy_M_d}.dat";
long maxlen = ;
if (File.Exists(fileName))
{
(long size,long offset) = (, );
FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
(size,offset) = GetFileInfo(stream);
//stream.Close();
maxlen = size + _defaultSize;
_memoryMapped = MemoryMappedFile.CreateFromFile(stream, mapname, maxlen, MemoryMappedFileAccess.ReadWrite, HandleInheritability.None, false);
_stream = _memoryMapped.CreateViewStream();
_stream.Position = offset == ? : offset;
}
else
{
maxlen = _defaultSize + ;
_memoryMapped = MemoryMappedFile.CreateFromFile(fileName, FileMode.OpenOrCreate, mapname, maxlen, MemoryMappedFileAccess.ReadWrite);
_stream = _memoryMapped.CreateViewStream();
_stream.Position = ;
} _capatity = maxlen - ;
} public long Position => _stream.Position; private (long, long) GetFileInfo(Stream stream)
{
try
{
byte[] byteSize = new byte[];
byte[] byteOffset = new byte[]; stream.Read(byteSize, , byteSize.Length);
stream.Read(byteOffset, , byteOffset.Length); return (BitConverter.ToInt64(byteSize, ), BitConverter.ToInt64(byteOffset, ));
}
catch (Exception e)
{
return (_defaultSize, );
}
} public bool IsAllowWrite(long size)
{
return _capatity - _stream.Position > size;
} public void WriteLength(long offset)
{
byte[] byteSize = BitConverter.GetBytes(_capatity);
byte[] byteOffset = BitConverter.GetBytes(offset);
_stream.Position = ;
_stream.Write(byteSize, , byteSize.Length);
_stream.Write(byteOffset, , byteOffset.Length);
} public void Write(byte[] bytes)
{
var _offset = _stream.Position;
WriteLength(_offset + bytes.Length);
_stream.Position = _offset;
_stream.Write(bytes, , bytes.Length);
} public void Dispose()
{
_memoryMapped?.Dispose();
_stream?.Dispose();
}
}
MemoryMappedFile的初级应用的更多相关文章
- 内存映射文件MemoryMappedFile使用
参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...
- 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)
马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- 在Linux和Windows平台上操作MemoryMappedFile(简称MMF)
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段..NET 4.0新增加了一个System.IO. MemoryMap ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- python 高级之面向对象初级
python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- codefordream 关于js初级训练
这里的初级训练相对简单,差不多都是以前知识温习. 比如输出“hello world”,直接使用console.log()就行.注释符号,“//”可以注释单行,快捷键 alt+/,"/* ...
随机推荐
- 用Helm部署Kubernetes应用,支持多环境部署与版本回滚
1 前言 Helm是优秀的基于Kubernetes的包管理器.利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离.现在 ...
- Pop!_OS安装与配置(二):基础配置
Pop!_OS相关使用配置 #0x0 书接上回 #0x1 换源 #0x10 nopasswd sudo #0x11 换国内源 0x2 安装应用 #0x0 书接上回 首先请看上一章末尾, Pop!_OS ...
- Python 默认参数 关键词参数 位置参数
def StudentInfo(country='中国', name): print('%s,%s' % (name, country)) StudentInfo('美国', '大卫') 上述代码报错 ...
- JavaScript学习 Ⅴ
十. 一些对象 Date 对象 Date对象用来表示一个时间 创建Date对象 如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行的时间 var d = new Date(); 创建一个 ...
- SQL列转行,行转列实现
在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...
- JavaScript之setinterval的具体使用
关于setInterval在api文档中也有很详细的解释,比如下面那两个: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停 ...
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- 神经网络结构:DenseNet
论文地址:密集连接的卷积神经网络 博客地址(转载请引用):https://www.cnblogs.com/LXP-Never/p/13289045.html 前言 在计算机视觉还是音频领域,卷积神经网 ...
- MySQL主从复制--单库复制搭建
背景说明 负责公司MySQL数仓的搭建和维护,因为前端业务涉及到一次业务表的分库,导致整个平台新增加一台MySQL服务器,需要将该库数据通过主从复制同步至原有的数仓实例. 数据流向说明如下图: 业务环 ...
- python发送邮件插件
github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...