Programiranje

Delo s pomnilniško preslikanimi datotekami v .Net

Dostop do datotek je zahtevna operacija. Dostop do datoteke z diska za aplikacijo je dolgotrajna operacija, dostop do podatkov iz primarnega pomnilnika pa je vedno hitrejši. Torej, kaj če bi diskovne datoteke, ki jih mora vaša aplikacija brati ali zapisovati, ostale v pomnilniku? Tu se natančno prilega koncept preslikanih datotek v pomnilnik. V tem članku bomo raziskali, kako lahko delamo s preslikanimi datotekami v .Net.

Predstavljamo pomnilniške datoteke

Datoteka, ki je preslikana s pomnilnikom, je objekt jedra, ki se uporablja za preslikavo datoteke na disku v regijo v primarnem pomnilniku. Datoteke, preslikane v pomnilnik, lahko v primerjavi z neposrednim dostopom do diska pri delu z veliko količino podatkov ali velikimi slikami znatno povečajo zmogljivost. Datoteke, ki so preslikane s pomnilnikom, so bile del API-ja Win32, vendar ste bili do nedavnega omejeni na uporabo C ++ ali PInvoke za pisanje kode, ki v vaši aplikaciji uporablja preslikane datoteke s pomnilnikom. Vendar lahko z .Net Framework 4 zdaj delate z mapami, ki so preslikane neposredno iz vaših .Net aplikacij - izvajalno okolje vam zdaj omogoča upravljani ovoj z vsemi potrebnimi razredi ovitkov za klic API-ja Win32. MSDN navaja: "Datoteka, ki je preslikana s pomnilnikom, vsebuje vsebino datoteke v navideznem pomnilniku. To preslikavo med datoteko in pomnilniškim prostorom aplikaciji, vključno z več procesi, omogoča spreminjanje datoteke z branjem in zapisovanjem neposredno v pomnilnik."

Zakaj potrebujete datoteke, preslikane s pomnilnikom?

Datoteke, ki so preslikane s pomnilnikom, so dobra izbira, kadar morate delati z veliko količino podatkov in se želite izogniti stroškom, povezanim z razvrščanjem in odstranjevanjem oznak, pri skupni rabi podatkov prek meja procesa. Datoteke, ki so preslikane v pomnilnik, so odlične pri obdelavi velike datoteke - branje velike datoteke je obsežna operacija. Z datotekami, ki so preslikane s pomnilnikom, lahko določen del datoteke preslikate v pomnilnik in s tem blokom izvedete V / I operacije, da pospešite dostop.

Datoteka, ki je preslikana s pomnilnikom, vam omogoča, da rezervirate obseg pomnilniškega naslova in uporabite diskovno datoteko kot fizični pomnilnik za rezervirani naslov. Z drugimi besedami, omogoča vam, da rezervirate prostor v pomnilniku in nato fizično shranite v to regijo. To vam omogoča dostop do podatkov na disku, ne da bi morali izvajati vhodno / izhodno operacijo datoteke. Datoteke, preslikane s pomnilnikom, vam omogočajo tudi skupno rabo podatkov v več procesih. Operacijski sistem skrbi za upravljanje pomnilnika za preslikane datoteke s pomnilnikom - ni vam treba skrbeti, kako je datoteka razdeljena na strani in upravljana. Zaščito lahko uporabite tudi v mapirani mapi s pomnilnikom z uporabo oštevilčenja MemoryMappedFileAccess kot parametra pri ustvarjanju preslikane datoteke s pomnilnikom.

Trajne in nestalne preslikane datoteke s pomnilnikom

V bistvu obstajata dve vrsti map preslikanih datotek. To so:

Vztrajno: Trajne preslikane datoteke s pomnilnikom so tiste, ki so povezane z izvorno datoteko na disku v vašem sistemu. Ko delate s temi vrstami datotek, preslikanih v pomnilnik, se podatki zadržijo na disku, potem ko zadnji postopek, ki dela z datoteko, konča svojo dejavnost.

Neobstojno: Nestalne preslikane datoteke s pomnilnikom so tiste, ki niso povezane z diskovno datoteko. Ko delate s temi vrstami preslikanih datotek v pomnilnik, se podatki ne ohranijo, ko je zadnji postopek, ki je delal na datoteki, končal svoje delo. Datoteke, ki so nepretrgane s pomnilnikom, so odlične za skupno rabo pomnilnika za medprocesne komunikacije.

Ustvarjanje trajnih mappiranih datotek

Če želite ustvariti trajno preslikano datoteko s pomnilnikom, morate uporabiti metodo CreateFromFile razreda MemoryMappedFile. Razred MemorymappedFile je prisoten v imenskem prostoru System.IO.MemoryMappedFiles.

Naslednji delček kode uporablja metodo CreateFromFile za ustvarjanje datoteke, preslikane v pomnilnik. Nato ustvari pomnilniško preslikan del datoteke.

statični dolgi odmik = 0x10000000; // 256 megabajtov

statična dolga dolžina = 0x20000000; // 512 megabajtov

statična praznina Main ()

        {

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

            {

z uporabo (var accessor = memoryMappedFile.CreateViewAccessor (odmik, dolžina))

                {

// Druga koda

                }

            }

        } 

Delček kode, ki je naveden v nadaljevanju, prikazuje, kako lahko berete podatke iz preslikane datoteke s pomnilnika.

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

            {

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

                {

var contentArray = nov bajt [1024];

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

niz vsebine = Encoding.UTF8.GetString (contentArray);

                }

            }

Ustvarjanje nestalnih map preslikanih datotek

Če želite ustvariti nestalne preslikane datoteke s pomnilnikom, tj. Datoteke, ki niso preslikane v obstoječo datoteko na disku, morate uporabiti metode CreateNew in CreateOrOpen.

Naslednji delček kode prikazuje, kako je mogoče ustvariti nestalno preslikano datoteko s pomnilnikom.

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

            {

z uporabo (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

var podatki = novo [] {(bajt) 'I', (bajt) 'D', (bajt) 'G'};

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

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Iz tega članka o MSDN lahko izveste več o preslikanih datotekah s pomnilnikom.

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