C# tutorials > Input/Output (I/O) and Networking > .NET Streams and File I/O > Memory-mapped files
Memory-mapped files
Memory-mapped files in C# provide a mechanism to treat a file as if it were directly mapped into memory. This offers significant performance advantages for certain operations, especially when dealing with large files or when multiple processes need to share data.
Basic Memory-Mapped File Creation and Access
This code demonstrates the creation of a memory-mapped file from an existing file. First, a file named 'test.data' is created and some initial data is written to it. Then, MemoryMappedFile.CreateFromFile()
is used to create a memory-mapped file based on this file. A MemoryMappedViewAccessor
is created to provide access to the memory region. The WriteArray()
method allows you to write data to the memory-mapped file. The example then reads the written data back for verification. The Access.ReadWrite
parameter specifies the access rights for the memory-mapped file.
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
public class MemoryMappedFileExample
{
public static void Main(string[] args)
{
string fileName = "test.data";
string dataToWrite = "Hello, Memory-Mapped Files!";
// Create a file to map
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
byte[] bytes = Encoding.UTF8.GetBytes(dataToWrite);
fs.Write(bytes, 0, bytes.Length);
fs.SetLength(bytes.Length);
}
// Create a memory-mapped file
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(
fileName,
FileMode.Open,
null,
0,
Access.ReadWrite))
{
// Create an accessor to write to the memory-mapped file
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
byte[] data = Encoding.UTF8.GetBytes("Modified: " + dataToWrite);
accessor.Write(0, data.Length);
accessor.WriteArray(0, data, 0, data.Length);
Console.WriteLine("Data written to memory-mapped file.");
// Read back the data (optional)
byte[] readBuffer = new byte[data.Length];
accessor.ReadArray(0, readBuffer, 0, data.Length);
string readData = Encoding.UTF8.GetString(readBuffer);
Console.WriteLine("Data read from memory-mapped file: " + readData);
}
}
}
}
Concepts Behind the Snippet
Memory-mapped files work by mapping a portion of a file (or the entire file) directly into a process's virtual address space. This eliminates the need for traditional read/write operations which involve copying data between the file system cache and the application's memory. Changes made to the memory-mapped file are automatically reflected in the underlying file, and vice-versa. This is handled by the operating system. Key components include:
Real-Life Use Case
A common use case is inter-process communication (IPC). Multiple processes can open the same memory-mapped file and share data without explicit data transfer mechanisms like pipes or sockets. Imagine a data acquisition system where one process is continuously writing sensor data to a memory-mapped file, and another process is reading and processing that data in real-time. Another common use is when dealing with extremely large files (terabytes) where reading the entire file into memory at once is not feasible. Memory mapping allows you to access portions of the file as needed.
Best Practices
When working with memory-mapped files, consider these practices:
MemoryMappedFile
and MemoryMappedViewAccessor
objects within using
statements or explicitly call their Dispose()
method to release resources.IOException
or UnauthorizedAccessException
.
Interview Tip
Be prepared to discuss the performance advantages of memory-mapped files over traditional file I/O. Highlight their suitability for large files and inter-process communication. Also, understand the importance of resource management and synchronization when working with shared memory.
When to Use Them
Memory-mapped files are beneficial in the following scenarios:
Memory Footprint
Memory-mapped files don't load the entire file into memory at once. Instead, the operating system manages the mapping between the file and the virtual address space. Only the portions of the file that are actively being accessed are loaded into physical memory. Therefore, the memory footprint is typically smaller compared to reading the entire file into memory. However, you need to account for page table entries, which consume memory.
Alternatives
Alternatives to memory-mapped files include:
Pros
Cons
FAQ
-
What happens if multiple processes write to the same memory location in a memory-mapped file?
Without proper synchronization, it can lead to data corruption. You need to use synchronization primitives (e.g., mutexes, semaphores) to ensure that only one process is writing to a specific memory location at a time.
-
Is it safe to use memory-mapped files for sensitive data?
Memory-mapped files store data in memory, which can potentially be exposed through memory dumps or other attacks. Encryption or other security measures should be considered when dealing with sensitive data.