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+/,"/* ...
随机推荐
- 查看windows操作系统的默认编码
转自:https://blog.csdn.net/zp357252539/article/details/79084480/ 在Windows平台下,进入DOS窗口,输入:chcp 可以得到操作系统的 ...
- day8 for循环+基本数据类型(上)
目录 一 for循环 1 什么是for循环 2 为什么要有for循环 3 如何使用for循环 二 基本数据类型的内置方法 2 字符串 2.1 类型转化 2.2 内置方法(优先掌握) 2.2.1 按索引 ...
- 大前端时代搞定PC/Mac端开发,我有绝招
如果你是一位前端开发工程师,对"跨平台"一词应该不会感到陌生.像常见的前端框架:比如React.Vue.Angular,它们可以做网页端,也可以做移动端,但很少能做到跨PC.Mac ...
- python numpy 保留满足指定条件的行
#arr_old 原来数组 #arr_new 保留后的数组 #>=mean+std 指定条件 arr_new = arr_old[arr_old[:,4]>=(mean+std),:]#筛 ...
- javascript基础(一): 浏览器控制台使用Element,console,network,source,application
console https://www.jianshu.com/p/67bcb481d1c5 Element https://www.kkpan.com/article/1845.html
- Flask 基础组件(十):中间件
from flask import Flask, flash, redirect, render_template, request app = Flask(__name__) app.secret_ ...
- C#文件说明
Bin -- 用来存放编译的结果,是默认的输出路径,项目属性—>配置属性—>输出路径. obj -- 用于存放编译过程中生成的中间临时文件.增量编译:项目属性—>配置属性—>高 ...
- three.js 制作属于自己的动态二维码
今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,在线案例点击博客原文.这是郭先生的微信二维码哦! 1. 解析图片流 canvas = document.cre ...
- 亚马逊如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 亚马逊如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载ap ...
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理的面试题, ...