Файл с памятью С# не занимает физическую память
Я пытаюсь кэшировать большое количество данных в физической памяти и делиться ими для других процессов в локальной среде. Поэтому я придумал MMF и прочитал документ Microsoft MMF, увидел несколько примеров и начал настраивать подобный код.
MemoryMappedFile MMF = MemoryMappedFile.CreateNew("Features", MaxSize);
.
.
.
using (MemoryMappedViewStream stream = MMF.CreateViewStream())
{
BinaryWriter write = new BinaryWriter(stream);
.
.
.
// Fetched the data from database and store it into Rowdata variable.
while (Rowdata.Read())
{
byte[] data = Rowdata.GetFieldValue<byte[]>(0);
write.Write(data);
}
}
Он не хранит данные в памяти
IVSSharedMemory - это то, над чем я работаю, но объем памяти должен быть намного выше этого.
![enter image description here]()
Есть ли что-то, что я забыл сделать, когда создал файл отображения памяти? пожалуйста, скажите мне, если есть. Я погуглил это сразу после того, как заметил это неожиданное поведение, и некоторые сказали, что это виртуальная память. Но я не могу не думать, что это неправда, потому что в документе это объясняется в разделе ниже.
Непостоянные файлы с отображением в памяти
Методы CreateNew и CreateOrOpen создают файл с отображением в памяти, который не сопоставляется с существующим файлом на диске.
Заранее спасибо. Только что подтвердил, что это то, для чего предназначен MMF.
ОБНОВИТЬ
Кажется, это действительно виртуальная память. Как прокомментировал Майк З, я проверил воспоминания о том, что мое приложение хранит в инструменте VMMAP, и в результате я получил именно то, что хотел.
![enter image description here]()
Но взгляните на это, количество выделенной памяти изменилось. Это происходит, когда мое приложение загружает все данные полностью. Я могу предположить, что предыдущий размер просто указывает на MaxSize
который я назначил при создании MMF.
![enter image description here]()
Это ушло на физическое дисковое пространство или что-то?
Я много читал о MemoryMappedFile и пытался увидеть, что под землей. Но я до сих пор не понимаю, почему это происходит. Серьезно, где находятся данные? где я могу это проверить?
Ответы
Ответ 1
Файл отображения памяти - это функциональность, предоставляемая ядром большинства современных ОС. Его целью является не загрузка файла в реальную физическую память, а использование функциональных возможностей сопоставления виртуальной памяти, чтобы обеспечить доступ к содержимому файла, как если бы он был блоком памяти.
Чтобы быть более точным, современные ОС используют механизм разбиения на страницы, который использует MMU-компьютер компьютера для сопоставления виртуального адресного пространства с физической памятью или файлом подкачки на диске. Так реализована виртуальная память. Идея состоит в том, что MMU преобразует доступ к памяти из ЦП в ОЗУ, используя отображение, поддерживаемое ядром, или если страница отсутствует (либо она была перенесена на диск, либо не отображается вообще), а затем создает аппаратное прерывание, которое вызовет ядро для устранения ошибки кэша. В случае файла с отображением в памяти это разрешение берет на себя загрузку отсутствующей страницы в основную память и прозрачное возобновление выполнения программы.