我想实现FancyCache或SuperCache 之类的东西。
该软件创建一个交换文件。磁盘 IO 是瓶颈。我需要在 RAM 中有一些文件,因为我需要它们快速。
我不需要完整的文件,只需要一些块。我没有将整个文件放在 RAM 磁盘中,因为它大约 40GB。但是这个文件有一些块需要在内存中。
我提到的软件使用最常见的文件来执行此操作。但我只需要用一个文件来做。
这适用于虚拟化环境。
您是否有关于如何创建这种模拟 Windows 交换文件的缓存的指南?
我想实现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;
}
我还没有测试过,但它会像这样^^^