Работа с картографирани в паметта файлове в .Net

Достъпът до файлове е операция, изискваща много ресурси. Достъпът до файл от диска за приложение е отнемаща време операция и достъпът до данни от първичната памет винаги е по-бърз. И така, какво ще стане, ако дисковите файлове, от които приложението ви трябва да чете или да пише, се намират в паметта? Точно тук се вписва концепцията за картографираните файлове в паметта. В тази статия ще разгледаме как можем да работим с картографираните в паметта файлове в .Net.

Представяне на картографирани файлове с памет

Файлът с карта на паметта е обект на ядрото, който се използва за картографиране на файл на диска ви в регион в основната памет. Файловете, картографирани в паметта, могат да увеличат значително производителността в сравнение с директния достъп до диска при работа с голямо количество данни или големи изображения. Файлове с карта на паметта са част от API на Win32, но доскоро бяхте ограничени да използвате C ++ или PInvoke за писане на код, който използва картографираните в паметта файлове във вашето приложение. С .Net Framework 4 обаче вече можете да работите с картографирани файлове директно от вашите .Net приложения - времето за изпълнение сега ви предоставя управлявана обвивка с всички необходими класове обвивки за извикване на Win32 API. MSDN гласи: "Съпоставен файл с памет съдържа съдържанието на файл във виртуална памет. Това съпоставяне между файл и пространство на паметта позволява приложение, включително множество процеси,за промяна на файла чрез четене и запис директно в паметта. "

Защо се нуждаете от картографирани файлове с памет?

Картираните в паметта файлове са добър избор, когато трябва да работите с голямо количество данни и бихте искали да избегнете разходите, свързани с марширане и демарширане, докато споделяте данни през границите на процеса. Картираните в паметта файлове са чудесни при обработката на голям файл - четенето на голям файл е операция с голям ресурс. С картографираните в паметта файлове можете да картографирате определена част от вашия файл в паметта и да извършвате I / O операции с този блок, за да ускорите достъпа.

Файлът с карта на паметта ви позволява да резервирате диапазон от адрес на паметта и да използвате дисков файл като физическо хранилище за запазения адрес. С други думи, това ви позволява да запазите място в паметта и след това да извършите физическо съхранение в този регион. Това ви позволява достъп до данни на диска, без да е необходимо да извършвате операция за входно / изходни файлове. Картираните с памет файлове също ви позволяват да споделяте данни в множество процеси. Операционната система се грижи за управлението на паметта за картографирани файлове в паметта - не е нужно да се притеснявате как файлът е разделен на страници и управляван. Можете също да приложите защита във вашия картографиран файл с памет, като използвате изброяването MemoryMappedFileAccess като параметър при създаване на картографиран файл с памет. 

Файлове с постоянна и непостоянна памет

По същество има два типа картографирани файлове в паметта. Това са:

Постоянни : Съпоставените с постоянна памет файлове са тези, които са свързани с изходен файл на диска във вашата система. Когато работите с тези видове картографирани файлове в паметта, данните се запазват на диска, след като последният процес, работещ с файла, приключи своята дейност.

Непостоянни : Непостоянните картографирани файлове с памет са тези, които не са свързани с дисков файл. Когато работите с този тип картографирани файлове в паметта, данните не се запазват, след като последният процес, работещ с файла, приключи работата си. Непостоянните картографирани файлове с памет са чудесни за споделяне на памет за комуникация между процесите.

Създаване на постоянни картографирани файлове с памет

За да създадете постоянен картографиран файл с памет, трябва да използвате метода CreateFromFile на класа MemoryMappedFile. Класът MemorymappedFile присъства в пространството от имена System.IO.MemoryMappedFiles.

Следният кодов фрагмент използва метода CreateFromFile за създаване на картографиран файл с памет. След това създава картиран изглед на памет към част от файла.

static long offset = 0x10000000; // 256 megabytes

static long length = 0x20000000; // 512 megabytes

        static void Main()

        {

            using (var memoryMappedFile = MemoryMappedFile.CreateFromFile("F:\\ImageData.png", FileMode.Open, "PartitionA"))

            {

                using (var accessor = memoryMappedFile.CreateViewAccessor(offset, length))

                {

                    //Other code

                }

            }

        } 

Даденият по-долу кодов фрагмент показва как можете да четете данни от картографиран файл с памет.

using (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile("F:\\LargeData.dat"))

            {

                using (MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream(0, 1204, MemoryMappedFileAccess.Read))

                {

                    var contentArray = new byte[1024];

                    memoryMappedViewStream.Read(contentArray, 0, contentArray.Length);

                    string content = Encoding.UTF8.GetString(contentArray);

                }

            }

Създаване на непостоянни файлове, картографирани в паметта

За да създадете непостоянни файлове, съпоставени с памет, т.е. файлове, които не са съпоставени със съществуващ файл на диска, трябва да използвате методите CreateNew и CreateOrOpen.

Следният кодов фрагмент илюстрира как може да се създаде непостоянен картографиран файл с памет.

using(MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateNew("idg.txt", 5))

            {

                using(MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor())

                {

                var data = new[] { (byte)'I', (byte)'D', (byte)'G'};

                for (int i = 0; i < data.Length; i++)

                    memoryMappedViewAccessor.Write(i, data[i]);

                memoryMappedViewAccessor.Dispose();

                memoryMappedFile.Dispose();

                }

            }

Можете да знаете повече за картографираните в паметта файлове от тази статия на MSDN.