Programmēšana

Darbs ar atmiņā kartētiem failiem .Net

Piekļuve failiem ir resursu ietilpīga darbība. Piekļuve failam no diska lietojumprogrammai ir laikietilpīga darbība, un piekļuve datiem no primārās atmiņas vienmēr ir ātrāka. Tātad, ja diskā faili, no kuriem jūsu lietojumprogrammai ir jālasa vai jāraksta, dzīvotu atmiņā? Tieši šeit ietilpst atmiņas kartēto failu jēdziens. Šajā rakstā mēs izpētīsim, kā mēs varam strādāt ar atmiņā kartētajiem failiem .Net.

Iepazīstinām ar atmiņā kartētajiem failiem

Atmiņā kartētais fails ir kodola objekts, ko izmanto, lai diskā esošo failu kartētu ar reģionu primārajā atmiņā. Atmiņā kartētajiem failiem var būt ievērojams veiktspējas pieaugums, salīdzinot ar tiešu piekļuvi diskam, strādājot ar lielu datu apjomu vai lieliem attēliem. Atmiņas kartētie faili ir daļa no Win32 API, taču līdz nesenam laikam jums bija ierobežota C ++ vai PInvoke izmantošana, lai rakstītu kodu, kas izmanto atmiņā kartētos failus jūsu lietojumprogrammā. Tomēr ar .Net Framework 4 tagad varat strādāt ar kartēm, kas saistītas ar atmiņu, tieši no savām .Net lietojumprogrammām - izpildlaiks tagad nodrošina pārvaldītu iesaiņotāju ar visām nepieciešamajām iesaiņotāju klasēm, lai izsauktu Win32 API. MSDN norāda: "Atmiņā kartētā failā ir faila saturs virtuālajā atmiņā. Šī kartēšana starp failu un atmiņas vietu ļauj lietojumprogrammai, ieskaitot vairākus procesus, modificēt failu, lasot un rakstot tieši atmiņā."

Kāpēc jums ir nepieciešami atmiņas kartētie faili?

Atmiņā kartētie faili ir laba izvēle, ja jums jāstrādā ar lielu datu apjomu, un jūs vēlētos izvairīties no izmaksām, kas saistītas ar maršēšanu un atdalīšanu, vienlaikus koplietojot datus pāri procesa robežām. Atmiņā kartētie faili lieliski palīdz apstrādāt lielu failu - liela faila lasīšana ir resursu apjomīga darbība. Izmantojot kartētos failus ar atmiņu, varat kartēt noteiktu faila daļu atmiņā un veikt I / O darbības ar šo bloku, lai paātrinātu piekļuvi.

Atmiņas kartētais fails ļauj rezervēt atmiņas adreses diapazonu un izmantot diska failu kā rezervētās adreses fizisko krātuvi. Citiem vārdiem sakot, tas ļauj rezervēt vietu atmiņā un pēc tam fiziski uzglabāt šo reģionu. Tas ļauj piekļūt diskā esošajiem datiem, neveicot failu I / O darbību. Atmiņas kartētie faili ļauj arī koplietot datus vairākos procesos. Operētājsistēma rūpējas par atmiņas kartēto failu atmiņas pārvaldību - jums nav jāuztraucas, kā fails tiek sadalīts lapās un tiek pārvaldīts. Varat arī piemērot atmiņā kartētā faila drošību, veidojot atmiņas kartētā faila parametru, izmantojot MemoryMappedFileAccess uzskaitījumu.

Noturīgi un nepastāvīgi kartēti faili ar atmiņu

Būtībā ir divu veidu atmiņā kartētie faili. Šie ir:

Noturīgs: Pastāvīgās atmiņas kartētie faili ir tie, kas ir saistīti ar avotu failu jūsu sistēmas diskā. Strādājot ar šāda veida atmiņā kartētajiem failiem, dati tiek saglabāti diskā pēc tam, kad pēdējais process, kas strādā ar failu, ir pabeidzis tā darbību.

Nepastāvīgs: Nepastāvīgi atmiņas kartētie faili ir tie, kas nav saistīti ar diska failu. Strādājot ar šāda veida atmiņā kartētajiem failiem, dati netiek saglabāti pēc tam, kad ir beidzies pēdējais ar failu saistītais process. Nepastāvīgi atmiņas kartētie faili lieliski palīdz koplietot atmiņu starpprocesuālajai komunikācijai.

Noturīgu atmiņā kartētu failu izveidošana

Lai izveidotu noturīgu atmiņas kartētu failu, jums jāizmanto klases MemoryMappedFile metode CreateFromFile. MemorymappedFile klase atrodas vārdu telpā System.IO.MemoryMappedFiles.

Šis koda fragments izmanto metodi CreateFromFile, lai izveidotu atmiņā kartētu failu. Pēc tam faila daļai tiek izveidots atmiņā kartēts skats.

statiskā garā nobīde = 0x10000000; // 256 megabaiti

statisks garš garums = 0x20000000; 512 megabaiti

static void Main ()

        {

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

            {

izmantojot (var accessor = memoryMappedFile.CreateViewAccessor (nobīde, garums))

                {

// Cits kods

                }

            }

        } 

Tālāk dotais koda fragments parāda, kā jūs varat nolasīt datus no kartētā faila.

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

            {

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

                {

var contentArray = jauns baits [1024];

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

virknes saturs = Encoding.UTF8.GetString (contentArray);

                }

            }

Nepastāvīgu atmiņā kartētu failu izveidošana

Lai izveidotu nepastāvīgus atmiņā kartētus failus, t.i., failus, kas nav piesaistīti esošam failam diskā, jums jāizmanto metodes CreateNew un CreateOrOpen.

Šis koda fragments parāda, kā var izveidot nepastāvīgu atmiņas kartētu failu.

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

            {

izmantojot [MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ()]

                {

var dati = jauns [] {(baits) 'I', (baits) 'D', (baits) 'G'};

par (int i = 0; i <dati. Garums; i ++)

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Šajā MSDN rakstā varat uzzināt vairāk par kartēm, kas saistītas ar atmiņu.

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