Bekerja dengan file yang dipetakan memori di .Net

Akses file adalah operasi intensif sumber daya. Mengakses file dari disk untuk suatu aplikasi adalah operasi yang memakan waktu, dan mengakses data dari memori utama selalu lebih cepat. Jadi, bagaimana jika file disk yang perlu dibaca atau ditulis oleh aplikasi Anda berada di memori? Di sinilah tepatnya konsep file yang dipetakan memori cocok. Dalam artikel ini, kita akan membahas tentang bagaimana kita dapat bekerja dengan file yang dipetakan memori di .Net.

Memperkenalkan file yang dipetakan memori

File yang dipetakan memori adalah objek kernel yang digunakan untuk memetakan file di disk Anda ke wilayah di memori utama. File yang dipetakan memori dapat memiliki peningkatan kinerja yang besar dibandingkan dengan akses disk langsung saat bekerja dengan data dalam jumlah besar atau gambar besar. File yang dipetakan memori telah menjadi bagian dari Win32 API, tetapi hingga saat ini, Anda dibatasi untuk menggunakan C ++ atau PInvoke untuk menulis kode yang memanfaatkan file yang dipetakan memori dalam aplikasi Anda. Namun dengan .Net Framework 4 Anda sekarang dapat bekerja dengan file yang dipetakan memori langsung dari aplikasi .Net Anda - runtime sekarang memberi Anda pembungkus terkelola dengan semua kelas pembungkus yang diperlukan untuk memanggil API Win32. MSDN menyatakan: "File yang dipetakan memori berisi konten file dalam memori virtual. Pemetaan antara file dan ruang memori ini memungkinkan aplikasi, termasuk beberapa proses,untuk mengubah file dengan membaca dan menulis langsung ke memori. "

Mengapa Anda membutuhkan file yang dipetakan memori?

File yang dipetakan memori adalah pilihan yang baik saat Anda perlu bekerja dengan data dalam jumlah besar dan Anda ingin menghindari biaya yang terkait dengan penyusunan dan pembongkaran saat berbagi data melintasi batas proses. File yang dipetakan memori sangat bagus dalam memproses file besar - membaca file besar adalah operasi sumber daya yang ekstensif. Dengan file yang dipetakan memori, Anda dapat memetakan bagian tertentu dari file Anda ke dalam memori dan melakukan operasi I / O dengan blok itu untuk mempercepat akses.

File yang dipetakan memori memungkinkan Anda untuk memesan berbagai alamat memori dan menggunakan file disk sebagai penyimpanan fisik untuk alamat yang dicadangkan. Dengan kata lain, ini memungkinkan Anda untuk memesan ruang di memori dan kemudian melakukan penyimpanan fisik ke wilayah itu. Hal ini memungkinkan Anda untuk mengakses data pada disk tanpa perlu melakukan operasi I / O file. File yang dipetakan memori juga memungkinkan Anda untuk berbagi data di beberapa proses. Sistem Operasi menangani pengelolaan memori untuk file yang dipetakan memori - Anda tidak perlu repot-repot bagaimana file tersebut dipartisi menjadi halaman dan dikelola. Anda juga dapat menerapkan keamanan di file yang dipetakan memori Anda dengan menggunakan penghitungan MemoryMappedFileAccess sebagai parameter saat membuat file yang dipetakan memori. 

File yang dipetakan memori persisten dan non-persisten

Pada dasarnya ada dua jenis file yang dipetakan memori. Ini adalah:

Persisten : File yang dipetakan memori persisten adalah file yang terkait dengan file sumber di disk di sistem Anda. Saat Anda bekerja dengan jenis file yang dipetakan memori ini, data disimpan dalam disk setelah proses terakhir yang mengerjakan file tersebut menyelesaikan aktivitasnya.

Non-persistent : File yang dipetakan memori non-persisten adalah yang tidak terkait dengan file disk. Saat Anda bekerja dengan jenis file yang dipetakan memori ini, data tidak dipertahankan setelah proses terakhir yang bekerja pada file tersebut telah menyelesaikan pekerjaannya. File yang dipetakan memori non-persisten sangat bagus dalam berbagi memori untuk komunikasi antar proses.

Membuat file yang dipetakan dengan memori persisten

Untuk membuat file yang dipetakan memori persisten, Anda perlu menggunakan metode CreateFromFile dari kelas MemoryMappedFile. Kelas MemorymappedFile ada di namespace System.IO.MemoryMappedFiles.

Cuplikan kode berikut menggunakan metode CreateFromFile untuk membuat file yang dipetakan memori. Ini selanjutnya membuat tampilan yang dipetakan memori ke sebagian file.

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

                }

            }

        } 

Potongan kode yang diberikan selanjutnya menunjukkan bagaimana Anda dapat membaca data dari file yang dipetakan memori.

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);

                }

            }

Membuat file yang dipetakan memori non-persisten

Untuk membuat file yang dipetakan dengan memori non-persisten, yaitu file yang tidak dipetakan ke file yang ada di disk, Anda perlu memanfaatkan metode CreateNew dan CreateOrOpen.

Cuplikan kode berikut mengilustrasikan bagaimana file yang dipetakan memori non-persisten dapat dibuat.

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();

                }

            }

Anda dapat mengetahui lebih banyak tentang file yang dipetakan memori dari artikel MSDN ini.