Programmering

Arbejde med hukommelseskortede filer i .Net

Filadgang er en ressourceintensiv operation. Adgang til en fil fra disken til et program er en tidskrævende handling, og adgang til data fra den primære hukommelse er altid hurtigere. Så hvad hvis de diskfiler, som din applikation skal læse fra eller skrive til, lå i hukommelsen? Dette er præcis, hvor begrebet hukommelseskortede filer passer ind. I denne artikel vil vi undersøge, hvordan vi kan arbejde med hukommelseskortede filer i .Net.

Introduktion til hukommelseskortede filer

En hukommelseskortet fil er et kerneobjekt, der bruges til at kortlægge en fil på din disk til en region i den primære hukommelse. Hukommelseskortede filer kan have store præstationsgevinster sammenlignet med direkte diskadgang, når du arbejder med store mængder data eller store billeder. Hukommelseskortede filer har været en del af Win32 API, men indtil for nylig var du begrænset til at bruge C ++ eller PInvoke til at skrive kode, der udnytter hukommelseskortede filer i din applikation. Men med .Net Framework 4 kan du nu arbejde med hukommelseskortede filer direkte fra dine .Net-applikationer - runtime giver dig nu en administreret indpakning med alle de nødvendige indpakningsklasser til at ringe til Win32 API. MSDN siger: "En hukommelseskortet fil indeholder indholdet af en fil i den virtuelle hukommelse. Denne kortlægning mellem en fil og hukommelsesplads gør det muligt for en applikation, inklusive flere processer, at ændre filen ved at læse og skrive direkte til hukommelsen."

Hvorfor har du brug for hukommelseskortede filer?

Hukommelseskortede filer er et godt valg, når du har brug for at arbejde med en stor mængde data, og du gerne vil undgå omkostningerne forbundet med marshaling og un-marshaling, mens du deler data på tværs af procesgrænser. Hukommelseskortede filer er gode til at behandle en stor fil - at læse en stor fil er en ressource omfattende operation. Med hukommelseskortede filer kan du kortlægge en bestemt del af din fil i hukommelsen og udføre I / O-operationer med den blok for at fremskynde adgangen.

En hukommelseskortet fil giver dig mulighed for at reservere en række hukommelsesadresser og bruge en diskfil som det fysiske lager for den reserverede adresse. Med andre ord giver det dig mulighed for at reservere en plads i hukommelsen og derefter forpligte fysisk lagring til denne region. Dette giver dig adgang til data på disken uden behov for at udføre fil I / O-handling. Hukommelseskortede filer giver dig også mulighed for at dele data på tværs af flere processer. Operativsystemet tager sig af administration af hukommelse til hukommelseskortede filer - du behøver ikke gider, hvordan filen er opdelt i sider og administreret. Du kan også anvende sikkerhed i din hukommelseskortede fil ved at bruge MemoryMappedFileAccess-optællingen som en parameter, når du opretter den hukommelseskortede fil.

Vedvarende og ikke-vedvarende hukommelseskortede filer

Der er stort set to typer hukommelseskortede filer. Disse er:

Vedholdende: Vedvarende hukommelseskortede filer er dem, der er knyttet til en kildefil på disken i dit system. Når du arbejder med disse typer hukommelseskortede filer, bevares data på disken, efter at den sidste proces, der arbejder på filen, er færdig med sin aktivitet.

Ikke-vedvarende: Ikke-vedvarende hukommelseskortede filer er dem, der ikke er knyttet til en diskfil. Når du arbejder med denne type hukommelseskortede filer, vedholdes data ikke, efter at den sidste proces, der arbejder på filen, er færdig med sit arbejde. Ikke-vedvarende hukommelseskortede filer er gode til at dele hukommelse til kommunikation mellem processer.

Oprettelse af vedvarende hukommelseskortede filer

For at oprette en vedvarende kortlagt hukommelsesfil skal du benytte metoden CreateFromFile i klassen MemoryMappedFile. MemorymappedFile-klassen findes i navneområdet System.IO.MemoryMappedFiles.

Følgende kodestykke gør brug af CreateFromFile-metoden til at oprette en hukommelseskortet fil. Derefter oprettes en hukommelseskortet visning til en del af filen.

statisk lang offset = 0x10000000; // 256 megabyte

statisk lang længde = 0x20000000; // 512 megabyte

statisk tomrum Main ()

        {

ved hjælp af (var memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ ImageData.png", FileMode.Open, "PartitionA"))

            {

ved hjælp af (var accessor = memoryMappedFile.CreateViewAccessor (offset, længde))

                {

// Anden kode

                }

            }

        } 

Kodestykket, der er angivet næste, viser hvordan du kan læse data fra en hukommelseskortet fil.

ved hjælp af (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ LargeData.dat"))

            {

ved hjælp af (MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream (0, 1204, MemoryMappedFileAccess.Read))

                {

var contentArray = ny byte [1024];

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

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

                }

            }

Oprettelse af ikke-vedvarende hukommelseskortede filer

For at oprette ikke-vedvarende hukommelseskortede filer, dvs. filer, der ikke er tilknyttet en eksisterende fil på disken, skal du udnytte metoderne CreateNew og CreateOrOpen.

Følgende kodestykke illustrerer, hvordan en ikke-vedvarende hukommelseskortet fil kan oprettes.

ved hjælp af (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateNew ("idg.txt", 5))

            {

ved hjælp af (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

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

for (int i = 0; i <data.Længde; i ++)

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Du kan vide mere om hukommelseskortede filer fra denne MSDN-artikel.