2013-04-04 3 views
1

Я хотел бы реализовать что-то вроде FancyCache или SuperCache.Как создать кеширование/свопинг/в кеше памяти

Программное обеспечение создает файл подкачки. Диск IO является узким местом. Мне нужно иметь некоторые файлы в ОЗУ, потому что мне нужно, чтобы они были быстрыми.

Мне не нужен полный файл, только некоторые блоки. Я не помещаю весь файл в RAM-диск, потому что он составляет около 40 ГБ. Но есть некоторые блоки этого файла, которые должны быть в памяти.

Программные продукты, о которых я упоминал, делают это с наиболее частыми файлами. Но мне нужно сделать это только с одним файлом.

Это место для виртуальной среды.

Есть ли у вас какие-либо руководства о том, как я могу создать такой вид кэша, имитирующий файл подкачки Windows?

+2

Почему вам нужно управлять поменять себя? Просто создайте объекты, представляющие нужные вам данные, и позвольте ОС обрабатывать свопинг, если это необходимо. – Bobson

+0

В этом случае это не работает. Я использую Hyper-V и нуждаюсь в наличии VHD в памяти. Смена не работает для hyper-v, поэтому Microsoft создает RAM-кеш в CSV (хранилище для виртуальных машин) в Windows Server 2012. –

ответ

3

Вы описывали сохраненные файлы с отображением памяти. Файл будет отображаться в вашу виртуальную память, и операционная система должна считывать и кэшировать элементы с физического диска.

Подробнее о MSDN: Memory-Mapped Files

+0

Чтобы развернуть это, вы можете выбрать определенные части файла для отображения в «представления» в памяти, поэтому вы можете использовать этот подход, даже если файл больше вашего виртуального адресного пространства. –

+0

@Simon Но файл будет иметь доступ к памяти только для программы или всей ОС? Что мне нужно для сценария виртуализации для всей ОС –

+0

Это процесс, который сопоставил файл с виртуальной памятью. Несколько процессов могут сделать это с одним и тем же файлом, предполагая, что параметры безопасности и совместного доступа позволяют это. Попробуйте, профиль и настройте, если есть проблемы с производительностью. – sisve

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

Я не проверял это, но она бы что-то подобное ^^^

+0

Почему downvote? – Icemanind

+0

Для работы вашего кода потребуется довольно много работы. Прямо сейчас, например, если я попытаюсь прочитать из смещения '1', а затем из offset' 0', возвращаемые данные будут от смещения '1'. И чтение больше, чем 'BlockSize' не работает. И я уверен, что в этом коде есть другие проблемы. (И это после исправления некоторых ошибок компиляции.) – svick

+0

@svick - Как я уже сказал, я его не тестировал. Его не предназначало для него просто копировать и вставлять. Это означало, что больше идея о том, как это было бы сделано, если бы он был заинтересован. Я оставил все проверки смещения и нулевые проверки намеренно, поэтому я мог просто показать точку – Icemanind

Смежные вопросы