Programavimas

Darbas su atminties susietais failais .NET

Failų prieiga yra daug išteklių reikalaujanti operacija. Programos prieiga iš failo iš disko yra daug laiko reikalaujanti operacija, o duomenis iš pirminės atminties visada galima pasiekti greičiau. Taigi, jei diske esantys failai, iš kurių reikia skaityti ar rašyti programai, buvo atmintyje? Būtent čia tinka atminties susietų failų samprata. Šiame straipsnyje mes išnagrinėsime, kaip galime dirbti su atminties susietais failais „.Net“.

Pristatome susietus atminties failus

Atmintyje susietas failas yra branduolio objektas, naudojamas susieti failą diske su regionu pirminėje atmintyje. Atmintyje susieti failai gali labai pagerinti našumą, palyginti su tiesiogine prieiga prie disko, kai dirbama su dideliu duomenų kiekiu ar dideliais vaizdais. Atminties susieti failai buvo „Win32“ API dalis, tačiau iki šiol jums reikėjo naudoti tik C ++ arba PInvoke, kad galėtumėte rašyti kodą, kuris panaudoja atminties susietus failus jūsų programoje. Tačiau naudodami .Net Framework 4 dabar galite dirbti su atminties susietais failais tiesiai iš savo .Net programų - vykdymo laikas dabar suteikia jums valdomą pakuotę su visomis būtinomis pakuočių klasėmis, kad galėtumėte iškviesti Win32 API. MSDN teigia: "Atmintyje susietame faile yra failo turinys virtualioje atmintyje. Šis susiejimas tarp failo ir atminties leidžia programai, įskaitant kelis procesus, modifikuoti failą, skaitant ir rašant tiesiai į atmintį."

Kodėl jums reikia atminties susietų failų?

Atmintyje susieti failai yra geras pasirinkimas, kai reikia dirbti su dideliu duomenų kiekiu, ir norėtumėte išvengti išlaidų, susijusių su persiuntimu ir pašalinimu, dalijantis duomenimis per proceso ribas. Atmintyje susieti failai puikiai apdoroja didelį failą - didelio failo skaitymas yra daug išteklių reikalaujanti operacija. Naudodami atmintyje susietus failus, galite susieti konkrečią failo dalį į atmintį ir atlikti įvesties / išvesties operacijas su tuo bloku, kad pagreitintumėte prieigą.

Atminties susietas failas leidžia rezervuoti atminties adresų diapazoną ir naudoti disko failą kaip fizinę rezervuoto adreso saugyklą. Kitaip tariant, tai leidžia rezervuoti vietą atmintyje ir paskui fiziškai saugoti tą regioną. Tai leidžia jums pasiekti duomenis diske, neatliekant failo įvesties / išvesties operacijos. Atmintyje susieti failai taip pat leidžia dalytis duomenimis keliuose procesuose. Operacinė sistema rūpinasi atminties susietų failų atminties valdymu - jums nereikia vargti, kaip failas padalijamas į puslapius ir tvarkomas. Taip pat galite pritaikyti saugumą atminties susietame faile naudodami „MemoryMappedFileAccess“ sąrašą kaip parametrą, kai kuriate atminties susietą failą.

Nuolatiniai ir nepatvarūs atminties susieti failai

Iš esmės yra dviejų tipų atmintyje susieti failai. Šitie yra:

Atkaklus: Nuolatinės atminties susieti failai yra tie, kurie yra susieti su šaltinio failu jūsų diske. Kai dirbate su šių tipų atminties susietais failais, duomenys bus išsaugoti diske, kai baigsis paskutinis su failu susijęs procesas.

Neištvermingas: Nuolatinės atminties susieti failai yra nesusieti su disko failu. Kai dirbate su tokio tipo atminties susietais failais, duomenys nebus išsaugoti, kai baigsis paskutinis su failu susijęs procesas. Nepastovios atminties susieti failai puikiai tinka dalijantis atmintimi tarpprocesiniams ryšiams palaikyti.

Nuolatinės atminties susietų failų kūrimas

Norėdami sukurti nuolatinį atminties susietą failą, turite naudoti klasės „MemoryMappedFile“ metodą „CreateFromFile“. „MemorymappedFile“ klasė yra vardų sistemoje System.IO.MemoryMappedFiles.

Šiame kodo fragmente naudojamas metodas „CreateFromFile“ kuriant atmintyje susietą failą. Tada jis sukuria atminties atvaizduotą failo dalies vaizdą.

statinis ilgasis poslinkis = 0x10000000; // 256 megabaitai

statinis ilgis = 0x20000000; // 512 megabaitai

statinis negaliojantis Pagrindinis ()

        {

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

            {

naudojant (var accessor = memoryMappedFile.CreateViewAccessor (kompensuoti, ilgis))

                {

// Kitas kodas

                }

            }

        } 

Toliau pateiktas kodo fragmentas rodo, kaip galite skaityti duomenis iš atminties susieto failo.

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

            {

naudojant [MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream (0, 1204, MemoryMappedFileAccess.Read)]

                {

var contentArray = naujas baitas [1024];

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

eilutės turinys = Encoding.UTF8.GetString (contentArray);

                }

            }

Nuolatinių atminties susietų failų kūrimas

Norėdami sukurti nepertraukiamus atminties susietus failus, t. Y. Failus, kurie nėra susieti su esamu diske esančiu failu, turite naudoti metodus „CreateNew“ ir „CreateOrOpen“.

Šis kodo fragmentas parodo, kaip galima sukurti nepertraukiamą atminties susietą failą.

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

            {

naudojant [MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ()]

                {

var duomenys = naujas [] {(baitas) 'I', (baitas) 'D', (baitas) 'G'};

už (int i = 0; i <duomenys. Ilgis; i ++)

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Iš šio MSDN straipsnio galite sužinoti daugiau apie atmintyje susietus failus.

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