Ohjelmointi

Työskentely muistikartoitettujen tiedostojen kanssa

Tiedoston käyttö on resursseja kuluttava toimenpide. Tiedostojen käyttäminen levyltä sovellusta varten on aikaa vievä toimenpide, ja pääsy ensisijaisen muistin tietoihin on aina nopeampaa. Joten, entä jos levytiedostot, joilta sovelluksesi täytyy lukea tai kirjoittaa, asuivat muistissa? Juuri tähän sopii muistikartoitettujen tiedostojen käsite. Tässä artikkelissa tutkitaan, miten voimme työskennellä muistikartoitettujen tiedostojen kanssa .Netissä.

Esittely muistikartoitetut tiedostot

Muistikartoitettu tiedosto on ytimen objekti, jota käytetään levyllä olevan tiedoston kartoittamiseen ensisijaisen muistin alueelle. Muistikartoitetuilla tiedostoilla voi olla merkittäviä parannuksia suorituskykyyn verrattuna suoraan levykäyttöön, kun käsitellään suuria määriä dataa tai suuria kuvia. Muistikartoitetut tiedostot ovat olleet osa Win32-sovellusliittymää, mutta viime aikoihin saakka rajoitit käyttämään C ++ - tai PInvoke-sovellusta koodin kirjoittamiseen, joka hyödyntää muistikartoitettuja tiedostoja sovelluksessasi. .Net Framework 4: n kanssa voit kuitenkin nyt työskennellä muistikartoitettujen tiedostojen kanssa suoraan .Net-sovelluksistasi - ajonaikainen ohjelma tarjoaa nyt hallitun kääreen kaikki tarvittavat käärintäluokat Win32-sovellusliittymän kutsumiseksi. MSDN toteaa: "Muistikartoitettu tiedosto sisältää tiedoston sisällön virtuaalimuistissa. Tämä tiedoston ja muistitilan välinen kartoitus antaa sovellukselle mahdollisuuden muokata tiedostoa lukemalla ja kirjoittamalla suoraan muistiin."

Miksi tarvitset muistikartoitettuja tiedostoja?

Muistikartoitetut tiedostot ovat hyvä valinta, kun sinun on työskenneltävä suuren datamäärän kanssa, ja haluat välttää marsallointiin ja purkamiseen liittyvät kustannukset jaettaessa tietoja prosessirajojen yli. Muistikartoitetut tiedostot pystyvät käsittelemään suuria tiedostoja - isojen tiedostojen lukeminen on resurssien laaja toiminta. Muistikartoitettujen tiedostojen avulla voit kartoittaa tietyn osan tiedostostasi muistiin ja suorittaa I / O-toimintoja tällä lohkolla nopeuttaaksesi käyttöä.

Muistikartoitetun tiedoston avulla voit varata muistiosoitealueen ja käyttää levytiedostoa varatun osoitteen fyysisenä tallennustilana. Toisin sanoen, sen avulla voit varata tilan muistista ja sitouttaa sitten fyysisen tallennustilan kyseiselle alueelle. Tämän avulla voit käyttää levyn tietoja tarvitsematta suorittaa tiedoston I / O-toimintoa. Muistikartoitettujen tiedostojen avulla voit myös jakaa tietoja useiden prosessien välillä. Käyttöjärjestelmä huolehtii muistikartoitettujen tiedostojen muistin hallinnasta - sinun ei tarvitse huolehtia siitä, miten tiedosto jaetaan sivuiksi ja miten sitä hallitaan. Voit myös käyttää suojausta muistikartoitetiedostossa käyttämällä MemoryMappedFileAccess-luetteloa parametrina luodessasi muistikartoitettua tiedostoa.

Pysyvät ja pysyvät muistikartoitetut tiedostot

Muistikartoitettuja tiedostoja on pohjimmiltaan kahdenlaisia. Nämä ovat:

Pysyvä: Pysyvät muistikartoitetut tiedostot ovat tiedostoja, jotka liittyvät järjestelmän levyllä olevaan lähdetiedostoon. Kun työskentelet tämän tyyppisten muistikartoitettujen tiedostojen kanssa, tiedot säilyvät levyllä sen jälkeen, kun viimeinen tiedostoa käsittelevä prosessi on saanut toimintansa päätökseen.

Ei-pysyvä: Pysymättömät muistikartoitetut tiedostot eivät ole yhteydessä levytiedostoon. Kun työskentelet tämän tyyppisten muistikartoitettujen tiedostojen kanssa, tietoja ei säilytetä, kun viimeinen tiedostoa käsittelevä prosessi on saanut työnsä päätökseen. Pysymättömät muistikartoitetut tiedostot ovat hyviä jakamaan muistia prosessien väliseen viestintään.

Pysyvien muistikartoitettujen tiedostojen luominen

Jotta voit luoda pysyvän muistikartoitetun tiedoston, sinun on käytettävä MemoryMappedFile-luokan CreateFromFile-menetelmää. MemorymappedFile-luokka on System.IO.MemoryMappedFiles-nimitilassa.

Seuraava koodinpätkä käyttää CreateFromFile-menetelmää muistiin yhdistetyn tiedoston luomiseen. Seuraavaksi se luo muistiin yhdistetyn näkymän osaan tiedostoa.

staattinen pitkä siirtymä = 0x10000000; // 256 megatavua

staattinen pitkä pituus = 0x20000000; // 512 megatavua

staattinen void Main ()

        {

käyttäen (var memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ ImageData.png", FileMode.Open, "PartitionA"))

            {

käyttäen (var accessor = memoryMappedFile.CreateViewAccessor (offset, pituus))

                {

// Muu koodi

                }

            }

        } 

Seuraavaksi annettu koodinpätkä osoittaa, kuinka voit lukea tietoja muistikartoitetusta tiedostosta.

käyttäen (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ LargeData.dat"))

            {

käyttäen (MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream (0, 1204, MemoryMappedFileAccess.Read))

                {

var contentArray = uusi tavu [1024];

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

merkkijonon sisältö = Encoding.UTF8.GetString (contentArray);

                }

            }

Pysyvien muistikartoitettujen tiedostojen luominen

Jos haluat luoda pysyviä muistikartoitettuja tiedostoja, ts. Tiedostoja, joita ei ole määritetty levyllä olevaan olemassa olevaan tiedostoon, sinun on käytettävä CreateNew- ja CreateOrOpen-menetelmiä.

Seuraava koodinpätkä kuvaa, kuinka pysyvä muistikartoitettu tiedosto voidaan luoda.

käyttäen (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateNew ("idg.txt", 5))

            {

käyttäen (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

var data = uusi [] {(tavu) 'I', (tavu) 'D', (tavu) 'G'};

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

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Tästä MSDN-artikkelista saat lisätietoja muistikartoitetuista tiedostoista.