Programovanie

Práca so súbormi mapovanými do pamäte v .Net

Prístup k súborom je operácia náročná na zdroje. Prístup k súboru z disku pre aplikáciu je časovo náročná operácia a prístup k údajom z primárnej pamäte je vždy rýchlejší. Čo teda v prípade, že súbory na disku, z ktorých musí vaša aplikácia čítať alebo do ktorého zapisovať, boli uložené v pamäti? Tu presne zapadá koncept súborov namapovaných do pamäte. V tomto článku sa budeme venovať tomu, ako môžeme pracovať so súbormi namapovanými v pamäti v .Net.

Predstavujeme súbory mapované do pamäte

Pamäťovo namapovaný súbor je objekt jadra, ktorý sa používa na mapovanie súboru na vašom disku na oblasť v primárnej pamäti. Súbory namapované do pamäte môžu mať veľké zvýšenie výkonu v porovnaní s priamym prístupom na disk pri práci s veľkým množstvom údajov alebo veľkými obrázkami. Súbory namapované na pamäť boli súčasťou rozhrania Win32 API, ale donedávna ste sa obmedzovali na používanie C ++ alebo PInvoke na písanie kódu, ktorý vo vašej aplikácii využíva súbory namapované na pamäť. Avšak s .Net Framework 4 môžete teraz pracovať so súbormi mapovanými do pamäte priamo z vašich aplikácií .Net - runtime vám teraz poskytuje spravovaný wrapper so všetkými potrebnými triedami wrapperov na volanie API Win32. MSDN uvádza: "Súbor mapovaný do pamäte obsahuje obsah súboru vo virtuálnej pamäti. Toto mapovanie medzi súborom a pamäťovým priestorom umožňuje aplikácii vrátane viacerých procesov upraviť súbor čítaním a zápisom priamo do pamäte."

Prečo potrebujete súbory namapované do pamäte?

Súbory namapované do pamäte sú dobrou voľbou, keď potrebujete pracovať s veľkým množstvom údajov a chceli by ste sa vyhnúť nákladom spojeným so zaradením a zrušením zaradenia pri zdieľaní údajov cez hranice procesu. Súbory mapované do pamäte sú vynikajúce pri spracovaní veľkého súboru - čítanie veľkého súboru je operácia náročná na zdroje. Pomocou súborov mapovaných do pamäte môžete namapovať konkrétnu časť vášho súboru do pamäte a vykonať I / O operácie s týmto blokom, aby ste urýchlili prístup.

Súbor mapovaný do pamäte vám umožňuje vyhradiť rozsah adresy pamäte a použiť súbor disku ako fyzické úložisko pre rezervovanú adresu. Inými slovami, umožňuje vám vyhradiť si miesto v pamäti a potom vyhradiť fyzické úložisko v tejto oblasti. Toto vám umožní prístup k údajom na disku bez potreby vykonávania vstupno-výstupných operácií so súbormi. Súbory mapované do pamäte vám tiež umožňujú zdieľať údaje vo viacerých procesoch. Operačný systém sa stará o správu pamäte pre súbory mapované do pamäte - nemusíte sa trápiť s tým, ako je súbor rozdelený na stránky a spravovaný. Zabezpečenie vo svojom súbore mapovanom do pamäte môžete použiť aj pomocou výčtu MemoryMappedFileAccess ako parametra pri vytváraní súboru mapovaného do pamäte.

Trvalé a nepretrvávajúce súbory mapované do pamäte

V zásade existujú dva typy súborov mapovaných do pamäte. Sú to:

Vytrvalé: Trvalé súbory namapované v pamäti sú tie, ktoré sú spojené so zdrojovým súborom na disku vo vašom systéme. Keď pracujete s týmito typmi súborov mapovaných do pamäte, dáta sa na disku zachovajú aj po ukončení činnosti posledného procesu pracujúceho na súbore.

Nepretrvávajúce: Nepermanentné súbory namapované v pamäti sú tie, ktoré nie sú spojené so súborom na disku. Keď pracujete s týmto typom súborov namapovaných na pamäť, údaje sa nezachovajú po ukončení práce posledného procesu pracujúceho na súbore. Súbory namapované na neperzistentnú pamäť sú vynikajúce pri zdieľaní pamäte pre medziprocesovú komunikáciu.

Vytváranie trvalých súborov mapovaných do pamäte

Ak chcete vytvoriť trvalý súbor namapovaný na pamäť, musíte využiť metódu CreateFromFile triedy MemoryMappedFile. Trieda MemorymappedFile je prítomná v mennom priestore System.IO.MemoryMappedFiles.

Nasledujúci úryvok kódu využíva metódu CreateFromFile na vytvorenie súboru mapovaného do pamäte. Ďalej vytvorí pohľad mapovaný do pamäte na časť súboru.

statický dlhý posun = 0x10000000; // 256 megabajtov

statická dlhá dĺžka = 0x20000000; // 512 megabajtov

static void Main ()

        {

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

            {

pomocou (var accessor = memoryMappedFile.CreateViewAccessor (offset, dĺžka))

                {

// Iný kód

                }

            }

        } 

Nasledujúci útržok kódu ukazuje, ako môžete čítať údaje zo súboru mapovaného do pamäte.

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

            {

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

                {

var contentArray = nový bajt [1024];

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

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

                }

            }

Vytváranie neperzistentných súborov mapovaných do pamäte

Ak chcete vytvoriť nepretrvávajúce súbory namapované na pamäť, t. J. Súbory, ktoré nie sú namapované na existujúci súbor na disku, musíte využiť metódy CreateNew a CreateOrOpen.

Nasledujúci útržok kódu ilustruje, ako je možné vytvoriť súbor mapovaný na trvalú pamäť.

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

            {

pomocou (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

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

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

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Viac informácií o súboroch mapovaných do pamäte sa dozviete z tohto článku na webe MSDN.

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