Programování

Práce se soubory mapovanými v paměti v .Net

Přístup k souborům je operace náročná na prostředky. Přístup k souboru z disku pro aplikaci je časově náročná operace a přístup k datům z primární paměti je vždy rychlejší. Co když soubory na disku, ze kterých vaše aplikace potřebuje číst nebo na které zapisovat, byly uloženy v paměti? Přesně tam zapadá koncept souborů mapovaných do paměti. V tomto článku prozkoumáme, jak můžeme pracovat se soubory mapovanými v paměti v .Net.

Představujeme soubory mapované do paměti

Soubor mapovaný do paměti je objekt jádra, který se používá k mapování souboru na vašem disku na oblast v primární paměti. Soubory namapované v paměti mohou mít velký nárůst výkonu ve srovnání s přímým přístupem na disk při práci s velkým množstvím dat nebo velkými obrázky. Soubory mapované na paměť byly součástí API Win32, ale donedávna jste byli omezeni na použití C ++ nebo PInvoke k zápisu kódu, který využívá soubory mapované na paměť ve vaší aplikaci. S .Net Framework 4 však nyní můžete pracovat se soubory mapovanými na paměť přímo z vašich aplikací .Net - modul runtime vám nyní poskytuje spravovanou obálku se všemi potřebnými obalovými třídami pro volání rozhraní Win32 API. MSDN uvádí: "Soubor mapovaný do paměti obsahuje obsah souboru ve virtuální paměti. Toto mapování mezi souborem a paměťovým prostorem umožňuje aplikaci, včetně více procesů, upravit soubor čtením a zápisem přímo do paměti."

Proč potřebujete soubory mapované do paměti?

Soubory mapované na paměť jsou dobrou volbou, když potřebujete pracovat s velkým množstvím dat a chcete se vyhnout nákladům spojeným se zařazováním a oddělováním při sdílení dat přes hranice procesu. Soubory mapované do paměti jsou skvělé při zpracování velkého souboru - čtení velkého souboru je operace s rozsáhlými prostředky. U souborů mapovaných do paměti můžete namapovat konkrétní část souboru do paměti a provádět I / O operace s tímto blokem, abyste urychlili přístup.

Soubor namapovaný v paměti umožňuje rezervovat rozsah adresy paměti a použít soubor disku jako fyzické úložiště pro rezervovanou adresu. Jinými slovy, umožňuje vám vyhradit si místo v paměti a poté do této oblasti uložit fyzické úložiště. To vám umožní přístup k datům na disku bez nutnosti provádění operace I / O souborů. Soubory mapované do paměti také umožňují sdílet data napříč více procesy. Operační systém se stará o správu paměti pro soubory mapované do paměti - nemusíte se obtěžovat, jak je soubor rozdělen na stránky a spravován. Můžete také použít zabezpečení v souboru mapovaném na paměť pomocí výčtu MemoryMappedFileAccess jako parametru při vytváření souboru mapovaného na paměť.

Trvalé a trvalé paměti mapované soubory

V zásadě existují dva typy souborů mapovaných do paměti. Tyto jsou:

Trvalý: Trvalé soubory mapované paměti jsou ty, které jsou přidruženy ke zdrojovému souboru na disku ve vašem systému. Když pracujete s těmito typy souborů mapovaných na paměť, data zůstanou na disku uložena i po dokončení činnosti posledního procesu práce se souborem.

Nepřetrvávající: Nepermanentní soubory mapované v paměti jsou ty, které nejsou spojeny se souborem na disku. Když pracujete s tímto typem souborů mapovaných do paměti, data nebudou přetrvávat po dokončení posledního procesu pracujícího na souboru. Nepermanentní soubory mapované paměti jsou skvělé při sdílení paměti pro komunikaci mezi procesy.

Vytváření trvalých souborů mapovaných do paměti

Chcete-li vytvořit soubor mapovaný na trvalou paměť, musíte využít metodu CreateFromFile třídy MemoryMappedFile. Třída MemorymappedFile je přítomna v oboru názvů System.IO.MemoryMappedFiles.

Následující fragment kódu využívá CreateFromFile metodu k vytvoření souboru mapovaného do paměti. Dále vytvoří pohled mapovaný do paměti na část souboru.

statický dlouhý offset = 0x10000000; // 256 MB

statická dlouhá délka = 0x20000000; // 512 MB

static void Main ()

        {

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

            {

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

                {

// Jiný kód

                }

            }

        } 

Níže uvedený fragment kódu ukazuje, jak můžete číst data ze souboru mapovaného do paměti.

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

            {

pomocí (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áření neperzistentních souborů mapovaných do paměti

Chcete-li vytvořit neperzistentní soubory namapované na paměť, tj. Soubory, které nejsou namapovány na existující soubor na disku, musíte využít metody CreateNew a CreateOrOpen.

Následující fragment kódu ukazuje, jak lze vytvořit soubor mapovaný na neperzistentní paměť.

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

            {

pomocí (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

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

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

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

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Další informace o souborech mapovaných do paměti najdete v tomto článku MSDN.