1

我想实现FancyCacheSuperCache 之类的东西。

该软件创建一个交换文件。磁盘 IO 是瓶颈。我需要在 RAM 中有一些文件,因为我需要它们快速。

我不需要完整的文件,只需要一些块。我没有将整个文件放在 RAM 磁盘中,因为它大约 40GB。但是这个文件有一些块需要在内存中。

我提到的软件使用最常见的文件来执行此操作。但我只需要用一个文件来做。

这适用于虚拟化环境。

您是否有关于如何创建这种模拟 Windows 交换文件的缓存的指南?

4

2 回答 2

3

您正在描述持久的内存映射文件。该文件将被映射到您的虚拟内存中,由操作系统从物理驱动器读取和缓存项目。

在 MSDN 上阅读更多内容:内存映射文件

于 2013-04-04T22:11:52.223 回答
-2

我要做的是从这样的课程开始:

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;
    }

我还没有测试过,但它会像这样^^^

于 2013-04-04T21:50:21.770 回答