Werken met geheugen toegewezen bestanden in .Net

Toegang tot bestanden is een operatie die veel middelen vergt. Toegang krijgen tot een bestand vanaf de schijf voor een toepassing is een tijdrovende handeling en toegang tot gegevens uit het primaire geheugen is altijd sneller. Dus, wat als de schijfbestanden waarvan uw toepassing moet lezen of schrijven zich in het geheugen bevinden? Dit is precies waar het concept van geheugen toegewezen bestanden in past. In dit artikel zullen we onderzoeken hoe we kunnen werken met geheugen toegewezen bestanden in .Net.

Introductie van geheugen toegewezen bestanden

Een geheugen toegewezen bestand is een kernelobject dat wordt gebruikt om een ​​bestand op uw schijf toe te wijzen aan een regio in het primaire geheugen. Geheugen toegewezen bestanden kunnen aanzienlijke prestatieverbeteringen opleveren in vergelijking met directe schijftoegang bij het werken met grote hoeveelheden gegevens of grote afbeeldingen. Geheugen toegewezen bestanden waren een onderdeel van de Win32 API, maar tot voor kort was u beperkt tot het gebruik van C ++ of PInvoke om code te schrijven die gebruikmaakt van geheugen toegewezen bestanden in uw toepassing. Met .Net Framework 4 kunt u nu echter rechtstreeks vanuit uw .Net-toepassingen met geheugen toegewezen bestanden werken - de runtime biedt u nu een beheerde wrapper met alle benodigde wrapper-klassen om de Win32 API aan te roepen. De MSDN stelt: "Een geheugen toegewezen bestand bevat de inhoud van een bestand in virtueel geheugen. Deze koppeling tussen een bestand en geheugenruimte maakt het mogelijk dat een toepassing, inclusief meerdere processen,om het bestand te wijzigen door het rechtstreeks in het geheugen te lezen en ernaar te schrijven. "

Waarom heb je geheugen toegewezen bestanden nodig?

Geheugen toegewezen bestanden zijn een goede keuze wanneer u met een grote hoeveelheid gegevens moet werken en u de kosten wilt vermijden die gepaard gaan met rangschikking en ontschaling terwijl u gegevens over procesgrenzen heen deelt. Geheugen toegewezen bestanden zijn geweldig in het verwerken van een groot bestand - het lezen van een groot bestand is een resource-uitgebreide operatie. Met geheugen toegewezen bestanden kunt u een specifiek gedeelte van uw bestand in het geheugen plaatsen en I / O-bewerkingen uitvoeren met dat blok om de toegang te versnellen.

Met een geheugen toegewezen bestand kunt u een reeks geheugenadressen reserveren en een schijfbestand gebruiken als fysieke opslag voor het gereserveerde adres. Met andere woorden, het stelt u in staat een ruimte in het geheugen te reserveren en vervolgens fysieke opslag aan die regio vast te leggen. Hierdoor hebt u toegang tot gegevens op de schijf zonder dat u I / O-bewerkingen hoeft uit te voeren. Met geheugen toegewezen bestanden kunt u ook gegevens delen over meerdere processen. Het besturingssysteem zorgt voor het beheer van het geheugen voor aan het geheugen toegewezen bestanden - u hoeft zich geen zorgen te maken over hoe het bestand is verdeeld in pagina's en beheerd. U kunt ook beveiliging toepassen in uw geheugen toegewezen bestand door de MemoryMappedFileAccess opsomming als parameter te gebruiken bij het maken van het geheugen toegewezen bestand. 

Aanhoudende en niet-permanente geheugen toegewezen bestanden

Er zijn in wezen twee soorten geheugentoewijzingsbestanden. Dit zijn:

Persistent : permanente geheugen toegewezen bestanden zijn bestanden die zijn gekoppeld aan een bronbestand op de schijf in uw systeem. Wanneer u met dit soort geheugentoewijzingsbestanden werkt, worden de gegevens op de schijf bewaard nadat het laatste proces dat aan het bestand heeft gewerkt, zijn activiteit heeft voltooid.

Niet-persistent : niet-persistent geheugen toegewezen bestanden zijn bestanden die niet zijn gekoppeld aan een schijfbestand. Wanneer u met dit type geheugen toegewezen bestanden werkt, worden de gegevens niet bewaard nadat het laatste proces dat aan het bestand heeft gewerkt, zijn werk heeft gedaan. Niet-permanente geheugen toegewezen bestanden zijn uitstekend geschikt voor het delen van geheugen voor communicatie tussen processen.

Creëren van permanent geheugen toegewezen bestanden

Om een ​​permanent geheugen toegewezen bestand te maken, moet u gebruik maken van de CreateFromFile methode van de MemoryMappedFile klasse. De klasse MemorymappedFile is aanwezig in de naamruimte System.IO.MemoryMappedFiles.

Het volgende codefragment maakt gebruik van de CreateFromFile-methode om een ​​geheugen toegewezen bestand te maken. Vervolgens wordt een in het geheugen toegewezen weergave van een deel van het bestand gemaakt.

static long offset = 0x10000000; // 256 megabytes

static long length = 0x20000000; // 512 megabytes

        static void Main()

        {

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

            {

                using (var accessor = memoryMappedFile.CreateViewAccessor(offset, length))

                {

                    //Other code

                }

            }

        } 

Het volgende codefragment laat zien hoe u gegevens kunt lezen uit een geheugen toegewezen bestand.

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

            {

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

                {

                    var contentArray = new byte[1024];

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

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

                }

            }

Aanmaken van niet-permanente geheugen toegewezen bestanden

Om niet-permanente geheugen toegewezen bestanden te maken, dwz bestanden die niet zijn toegewezen aan een bestaand bestand op de schijf, moet u de methoden CreateNew en CreateOrOpen gebruiken.

Het volgende codefragment illustreert hoe een niet-permanent geheugen toegewezen bestand kan worden gemaakt.

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

            {

                using(MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor())

                {

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

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

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

                memoryMappedViewAccessor.Dispose();

                memoryMappedFile.Dispose();

                }

            }

In dit MSDN-artikel vindt u meer informatie over geheugen toegewezen bestanden.