Programmering

Arbeide med minnekartede filer i .Net

Filtilgang er en ressurskrevende operasjon. Å få tilgang til en fil fra disken for et program er en tidkrevende operasjon, og tilgang til data fra primærminnet er alltid raskere. Så hva om diskfilene applikasjonen din trenger å lese fra eller skrive til, ligger i minnet? Dette er nøyaktig hvor begrepet minnekartede filer passer inn. I denne artikkelen vil vi undersøke hvordan vi kan jobbe med minnekartede filer i .Net.

Vi presenterer minnekartede filer

En minnekartet fil er et kjerneobjekt som brukes til å tilordne en fil på disken til en region i primærminnet. Minnekartede filer kan ha store ytelsesgevinster sammenlignet med direkte disktilgang når du arbeider med store mengder data eller store bilder. Minnekartede filer har vært en del av Win32 API, men inntil nylig var du begrenset til å bruke C ++ eller PInvoke til å skrive kode som utnytter minnekartede filer i applikasjonen din. Men med .Net Framework 4 kan du nå jobbe med minnekartede filer direkte fra .Net-applikasjonene - kjøretiden gir deg nå en administrert wrapper med alle nødvendige wrapper-klasser for å ringe Win32 API. MSDN sier: "En minnekartet fil inneholder innholdet i en fil i det virtuelle minnet. Denne kartleggingen mellom en fil og minneplass gjør det mulig for et program, inkludert flere prosesser, å modifisere filen ved å lese og skrive direkte til minnet."

Hvorfor trenger du minnekartede filer?

Minnekartede filer er et godt valg når du trenger å jobbe med en stor mengde data, og du vil unngå kostnadene forbundet med marshaling og un-marshaling mens du deler data på tvers av prosessgrenser. Minnekartede filer er gode til å behandle en stor fil - å lese en stor fil er en ressurs omfattende operasjon. Med minnekartede filer kan du kartlegge en bestemt del av filen din i minnet og utføre I / O-operasjoner med den blokken for å få raskere tilgang.

En minnekartet fil lar deg reservere en rekke minneadresser og bruke en diskfil som den fysiske lagringen for den reserverte adressen. Med andre ord, det lar deg reservere en plass i minnet og deretter forplikte fysisk lagring til den regionen. Dette gir deg tilgang til data på disken uten å måtte utføre fil I / O-operasjon. Minnekartede filer lar deg også dele data på tvers av flere prosesser. Operativsystemet tar seg av administrering av minne for minnekartede filer - du trenger ikke bry deg om hvordan filen er delt inn i sider og administrert. Du kan også bruke sikkerhet i den minnekartede filen ved å bruke MemoryMappedFileAccess-oppregningen som en parameter når du oppretter en minnekartet fil.

Vedvarende og ikke-vedvarende minnekartede filer

Det er i hovedsak to typer minnekartede filer. Disse er:

Vedvarende: Vedvarende minnekartede filer er de som er knyttet til en kildefil på disken på systemet ditt. Når du jobber med denne typen minnekartede filer, blir data vedvaret på disken etter at den siste prosessen som arbeidet med filen er ferdig med aktiviteten.

Ikke-vedvarende: Ikke-vedvarende minnekartede filer er de som ikke er tilknyttet en diskfil. Når du jobber med denne typen minnekartede filer, vedvares ikke data etter at den siste prosessen som arbeidet med filen er ferdig. Ikke-vedvarende minnekartede filer er gode til å dele minne for kommunikasjon mellom prosesser.

Opprette vedvarende minnekartede filer

For å lage en vedvarende minnekartet fil, må du bruke CreateFromFile-metoden i MemoryMappedFile-klassen. MemorymappedFile-klassen er tilstede i navneområdet System.IO.MemoryMappedFiles.

Følgende kodebit bruker CreateFromFile-metoden for å lage en minnekartet fil. Det oppretter deretter en minnekartet visning til en del av filen.

statisk lang offset = 0x10000000; // 256 megabyte

statisk lang lengde = 0x20000000; // 512 megabyte

statisk tomrom Main ()

        {

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

            {

bruker (var accessor = memoryMappedFile.CreateViewAccessor (forskyvning, lengde))

                {

// Annen kode

                }

            }

        } 

Kodebiten gitt neste viser hvordan du kan lese data fra en minnekartet fil.

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

            {

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

                {

var contentArray = ny byte [1024];

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

strenginnhold = Koding.UTF8.GetString (contentArray);

                }

            }

Opprette ikke-vedvarende minnekartede filer

For å opprette ikke-vedvarende minnekartede filer, dvs. filer som ikke er kartlagt til en eksisterende fil på disken, må du utnytte metodene CreateNew og CreateOrOpen.

Følgende kodebit illustrerer hvordan en ikke-vedvarende minnekartet fil kan opprettes.

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

            {

bruker (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

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

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

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Du kan vite mer om minnekartede filer fra denne MSDN-artikkelen.

$config[zx-auto] not found$config[zx-overlay] not found