如何创建缓存/交换/内存缓存
本文关键字:缓存 交换 内存 创建 何创建 | 更新日期: 2023-09-27 18:07:23
我想实现一些像FancyCache或SuperCache。
软件创建一个交换文件。磁盘IO是瓶颈。我需要在RAM中存放一些文件,因为我需要它们更快。
我不需要完整的文件,只需要一些块。我没有把整个文件放在RAM磁盘中,因为它大约有40gb。但是这个文件的一些块需要放在内存中。
我提到的软件对最常见的文件执行此操作。但是我只需要用一个文件来做。
用于虚拟化环境。
你有任何指导我如何创建这种缓存模拟Windows的交换文件吗?
您正在向描述持久化的内存映射文件。该文件将被映射到您的虚拟内存中,并由操作系统从物理驱动器读取和缓存项。
阅读更多关于MSDN:内存映射文件
我要做的就是从这样一个类开始:
public class SwapData
{
public const int BlockSize = 1024;
private int HotCount {
get;
set;
}
private long Offset {
get;
set;
}
private byte[] Data {
get;
set;
}
private string FileName {
get;
set;
}
}
public class SwapFile
{
private List<SwapData> _swapData;
public string SwapFileName
{ get; set; }
public byte[] ReadData(string fileName, long offset, int numBytes)
{
if (!Cached(fileName, offset))
{
return StoreCache(fileName, offset);
} else return Cache(fileName, offset, numBytes);
}
private bool Cached(string fileName, long offset)
{
return _swapData.Any(z => z.FileName.ToLower().Equals(fileName.ToLower()) && z.Offset >= offset);
}
private byte[] StoreCache(string fileName, long offset)
{
using (var bw = new BinaryReader(File.Open(fileName, FileMode.Open)))
{
bw.BaseStream.Seek(offset, SeekOrigin.Begin);
var sd = new SwapData();
sd.HotCount = 0;
sd.Office = offset;
sd.FileName = fileName;
sd.Data = bw.ReadBytes(sd.BlockSize);
_swapData.Add(sd);
return sd.Data;
}
}
private byte[] Cache(string fileName, long offset, int numBytes)
{
byte[] data = _swapData.FirstOrDefault(z => z.FileName.ToLower().Equals(fileName.ToLower()) && z.Offset >= offset).Data;
byte[] target = new byte[numBytes];
Array.Copy(data,target,numBytes);
return target;
}
我还没有测试过,但是它应该是这样的^^^