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+/,"/* ...
随机推荐
- 图形处理:给 Canvas 文本填充线性渐变
作者:凹凸曼 - Barrior 在 Canvas 中对文本填充水平或垂直的线性渐变可以轻易实现,而带角度的渐变就复杂很多:就好像下面这样,假设文本矩形宽为 W, 高为 H, 左上角坐标为 X, Y. ...
- 《Spring全局异常处理》从零掌握@ControllerAdvice注解
一.开门见山 在前后端分离框架的大趋势下,前后端基本的职责已经确定. 前端主要负责界面的处理以及基本的判空检验.数据来源则通过vue调用后端发布的接口. 后端的原型还是mvc的模式: controll ...
- XSS 跨站脚本
xss常用绕过姿势 大小写绕过 利用语句: http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!" ...
- WeChat小程序开发-初学者笔记(一)
WeChat小程序开发学习第一天: 完成学习目标: 1.安装并了解Wechat小程序的基本环境, 2.可以利用已学知识的结合简单实现helloWorld界面. 学习过程: 1.首先在微信平台上进行相关 ...
- python爬虫中对含中文的url处理以 及 Python3—UnicodeEncodeError 'ascii' codec can't encode characters in position
在练习urllib操作中,遇到了url中含有中文字符的问题.比如http://dotamax.com/,看下源码的话,上方的搜索框的name=p,输入内容点击搜索以后,通过GET方法进行传递,比如我们 ...
- java 基础(四)搭建vim作为java开发环境
分享在Ubuntu 14.04在Vim上配置Java开发环境的过程步骤,希望对大家有所帮助. A 首先下载javacomplete.zip 到Linux公社资源站下载: --------------- ...
- 数据可视化之powerBI基础(二)PowerBI动态图表技巧:钻取交互
https://zhuanlan.zhihu.com/p/64406366 查看可视化图表的时候,我们可能想深入了解某个视觉对象的更详细信息,或者进行更细粒度的分析,比如看到2017年的总体数据,同时 ...
- POJ 1046 Color Me Less 最详细的解题报告
题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...
- Log4net控制台和窗体程序无法输出记录的原因之一
在asp.net web应用程序中,读取log4net的配置文件可以这样写: [assembly:log4net.Config.XmlConfigurator(ConfigFile="Web ...
- bzoj4582[Usaco2016 Open]Diamond Collector
bzoj4582[Usaco2016 Open]Diamond Collector 题意: n个钻石,每个都有一个大小,现在将其装进2个盒子里,每个盒子里的钻石最大的与最小的大小不能超过k,问最多能装 ...