我想实施类似FancyCache或SuperCache。如何创建缓存/交换/内存缓存
该软件创建一个交换文件。磁盘IO是一个瓶颈。我需要在RAM中有一些文件,因为我需要它们很快。
我不需要完整的文件,只有一些块。我不把整个文件放在RAM磁盘上,因为它大约是40GB。但是这个文件有一些块需要在内存中。
我提到的软件使用最频繁的文件。但我只需要用一个文件来完成。
这是一个虚拟化环境。
是否有任何指导我如何创建这种模拟Windows Swap文件的缓存?
我想实施类似FancyCache或SuperCache。如何创建缓存/交换/内存缓存
该软件创建一个交换文件。磁盘IO是一个瓶颈。我需要在RAM中有一些文件,因为我需要它们很快。
我不需要完整的文件,只有一些块。我不把整个文件放在RAM磁盘上,因为它大约是40GB。但是这个文件有一些块需要在内存中。
我提到的软件使用最频繁的文件。但我只需要用一个文件来完成。
这是一个虚拟化环境。
是否有任何指导我如何创建这种模拟Windows Swap文件的缓存?
你描述到持久化内存映射文件。该文件将映射到您的虚拟内存中,操作系统可以从物理驱动器读取和缓存项目。了解更多关于MSDN
为了扩展此功能,您可以选择文件的特定部分以映射到内存中的“视图”,因此即使文件大于虚拟地址空间,也可以使用此方法。 – 2013-04-05 00:34:49
@Simon但是该文件将只有程序或整个操作系统的内存访问权限?我需要虚拟化场景的是整个操作系统 – 2013-04-17 21:04:59
这是将文件映射到虚拟内存空间的过程。假设安全性和共享参数允许,几个进程可以使用同一个文件来完成此操作。如果有任何性能问题,请尝试一下,剖析并调整。 – sisve 2013-04-18 07:45:03
我会做的就是开始像这样一类:
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;
}
我没有测试过这还,但它会去这样的事情^^^
为什么downvote? – Icemanind 2013-04-04 22:01:56
这将需要相当多的工作来使你的代码工作。现在,例如,如果我尝试读取偏移量'1',然后从偏移量'0'读取,则返回的数据将来自偏移量'1'。读取超过'BlockSize'不起作用。我相信这段代码还有其他问题。 (这是修复了一些编译错误之后。) – svick 2013-04-04 22:03:18
@svick - 正如我所说的,我没有测试过它。这并不意味着他只是复制和粘贴。如果他有兴趣,它的意思就是更好地了解如何完成。我忽略了所有偏移检查和空检查,所以我可以显示点 – Icemanind 2013-04-04 22:09:49
为什么你需要管理自己掉?只需创建表示所需数据的对象,并在必要时让操作系统处理交换。 – Bobson 2013-04-04 21:53:10
在这种情况下它不起作用。我正在使用Hyper-V,并且需要在内存中有VHD。交换不适用于hyper-v,这就是为什么Microsoft在Windows Server 2012中为CSV(虚拟机的存储)创建RAM缓存。 – 2013-04-05 21:19:34