Rad s datotekama mapiranim u memoriju u .Netu

Pristup datotekama operacija je koja zahtijeva velike resurse. Pristup datoteci s diska za aplikaciju dugotrajna je operacija, a pristup podacima iz primarne memorije uvijek je brži. Pa, što ako su datoteke s diska iz kojih vaša aplikacija treba čitati ili pisati boravile u memoriji? Tu se točno uklapa koncept mapiranih mapa. U ovom ćemo članku istražiti kako možemo raditi s mapama mapiranim u memoriju u .Netu.

Predstavljamo datoteke preslikane u memoriju

Datoteka preslikana u memoriju je objekt jezgre koji se koristi za mapiranje datoteke na vašem disku u regiju u primarnoj memoriji. Datoteke preslikane u memoriju mogu značajno poboljšati performanse u usporedbi s izravnim pristupom disku pri radu s velikom količinom podataka ili velikim slikama. Datoteke preslikane u memoriju bile su dio Win32 API-ja, ali sve donedavno bilo vam je ograničeno korištenje C ++ ili PInvoke za pisanje koda koji koristi mapirane datoteke mapirane u vašoj aplikaciji. Međutim, s .Net Framework 4 sada možete raditi s mapama mapiranim datotekama izravno iz vaših .Net aplikacija - runtime vam sada pruža upravljani omot sa svim potrebnim klasama omotača za pozivanje Win32 API-ja. MSDN navodi: "Datoteka preslikana u memoriju sadrži sadržaj datoteke u virtualnoj memoriji. Ovo mapiranje između datoteke i memorijskog prostora omogućuje aplikaciji, uključujući više procesa,za izmjenu datoteke čitanjem i pisanjem izravno u memoriju. "

Zašto su vam potrebne mapirane mape?

Datoteke preslikane u memoriju dobar su izbor kada trebate raditi s velikom količinom podataka i želite izbjeći troškove povezane s marširanjem i demarširanjem dok dijelite podatke preko granica procesa. Datoteke preslikane u memoriju izvrsno obrađuju veliku datoteku - čitanje velike datoteke operacija je opsežna. S datotekama mapiranim u memoriju možete mapirati određeni dio datoteke u memoriju i izvoditi I / O operacije s tim blokom kako biste ubrzali pristup.

Datoteka preslikana u memoriju omogućuje vam rezerviranje raspona memorijske adrese i upotrebu diskovne datoteke kao fizičke pohrane za rezerviranu adresu. Drugim riječima, omogućuje vam rezerviranje prostora u memoriji i zatim predavanje fizičke pohrane toj regiji. To vam omogućuje pristup podacima na disku bez potrebe izvođenja I / O operacija datoteke. Datoteke preslikane u memoriju također vam omogućuju dijeljenje podataka u više procesa. Operativni sustav brine se o upravljanju memorijom za datoteke preslikane u memoriju - ne morate se truditi kako se datoteka dijeli na stranice i kako se njome upravlja. Također možete primijeniti sigurnost u vašoj mapiranoj memoriji pomoću nabrajanja MemoryMappedFileAccess kao parametra prilikom stvaranja preslikane datoteke u memoriju. 

Trajne i nepostojane memorirane datoteke

U osnovi postoje dvije vrste datoteka preslikanih u memoriju. Ovi su:

Trajne : Trajne mapirane memorijske datoteke su one koje su povezane s izvornom datotekom na disku u vašem sustavu. Kada radite s ovim vrstama preslikanih datoteka u memoriju, podaci se zadržavaju na disku nakon što zadnji postupak koji radi na datoteci završi svoju aktivnost.

Nepostojane : Nestalne preslikane memorijske datoteke su one koje nisu povezane s datotekom diska. Kada radite s ovom vrstom preslikanih datoteka u memoriju, podaci se neće zadržati nakon što je zadnji rad na datoteci završio svoj posao. Datoteke preslikane u nepostojanu memoriju izvrsno dijele memoriju za međusobnu komunikaciju.

Stvaranje trajnih memorijskih mapiranih datoteka

Da biste stvorili trajnu datoteku mapiranu u memoriju, trebate koristiti metodu CreateFromFile klase MemoryMappedFile. Klasa MemorymappedFile prisutna je u prostoru imena System.IO.MemoryMappedFiles.

Sljedeći isječak koda koristi metodu CreateFromFile za stvaranje datoteke preslikane u memoriju. Dalje stvara memorijski mapirani prikaz dijela datoteke.

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

                }

            }

        } 

Sljedeći isječak koda pokazuje kako možete čitati podatke iz datoteke mapirane u memoriju.

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

                }

            }

Stvaranje nepostojanih memoriranih datoteka

Da biste stvorili nepostojane mapirane datoteke s memorijom, tj. Datoteke koje nisu preslikane u postojeću datoteku na disku, trebate koristiti metode CreateNew i CreateOrOpen.

Sljedeći isječak koda ilustrira kako se može stvoriti nepostojana datoteka preslikana u memoriju.

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();

                }

            }

Iz ovog MSDN-ovog članka možete saznati više o mapama preslikanim u memoriju.