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的初级应用的更多相关文章

  1. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  2. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

  3. MemoryMappedFile 在 Mono in Linux 的开发笔记

    前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...

  4. 在Linux和Windows平台上操作MemoryMappedFile(简称MMF)

    操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段..NET 4.0新增加了一个System.IO. MemoryMap ...

  5. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  6. python 高级之面向对象初级

    python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...

  7. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  8. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  9. codefordream 关于js初级训练

    这里的初级训练相对简单,差不多都是以前知识温习. 比如输出“hello world”,直接使用console.log()就行.注释符号,“//”可以注释单行,快捷键 alt+/,"/*   ...

随机推荐

  1. 微信解密encryptedDataStr获取用户信息

    A:<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">& ...

  2. day29 作业

    1.引入属性访问控制+property 2.引入继承与派生的概念来减少代码冗余 注意:要满足什么"是"什么的关系,不满足"是"的关系不要去继承 import u ...

  3. eShopOnContainers 知多少[11]:服务间通信之gRPC

    引言 最近翻看最新3.0 eShopOncontainers源码,发现其在架构选型中补充了 gRPC 进行服务间通信.那就索性也写一篇,作为系列的补充. gRPC 老规矩,先来理一下gRPC的基本概念 ...

  4. Scala 面向对象(六):面向对象的特征二:继承 (一)

    1 Scala继承的基本语法 class 子类名 extends 父类名 { 类体 } class Person { var name : String = _ var age : Int = _ d ...

  5. java 数据结构(十):Collection子接口:Set接口

    1. 存储的数据特点:无序的.不可重复的元素具体的: 以HashSet为例说明:1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的.2. 不可重复性 ...

  6. 数据可视化之DAX篇(二十三)ALLEXCEPT应用示例:更灵活的累计求和

    https://zhuanlan.zhihu.com/p/67441847 累计求和问题,之前已经介绍过(有了这几个公式,你也可以快速搞定累计求和),主要是基于比较简单的情形,针对所有的数据进行累计求 ...

  7. vue axios接口封装、Promise封装、简单的axios方法封装、vue接口方法封装、vue post、get、patch、put方法封装

    相信大家在做前后端数据交互的时候都会给请求做一些简单的封装就像之前封装ajax方法一样axios的封装也是一样的简单下面这个就是封装的axios的方法,require.js import axios ...

  8. c++运行程序 鼠标点击按钮 (c++)(windows)

    简介 这是在黑漆漆的程序中,制造用户可点击的按钮,来决定程序下一步该作什么,的基本代码. 详解 头文件 <cstdio>和<windows.h> 结构体 //这不全别复制 st ...

  9. Pull后产生多余的log(Merge branch 'master' of ...)

    第一步: git reset --hard 73d0d18425ae55195068d39b3304303ac43b521a 第二步: git push -f origin feature/PAC_1 ...

  10. JS常用知识点(一)

    1.js数据类型 基本类型:String.Number.boolean.null.undefined.Symbol 引用类型:Object null和undefined的区别:undefined表示定 ...