Как предотвратить сохранение одного и того же файла несколько раз в памяти
Я хочу читать файлы (1 ГБ) на байт, используя MemoryMappedFile из нескольких потоков (и процессов!), мой пример кода:
static unsafe void T()
{
MemoryMappedFile mmf = null;
var mmfName = "q1";
var fname = @"%file_name%";
lock (Lock)
{
try
{
mmf = MemoryMappedFile.OpenExisting(mmfName, MemoryMappedFileRights.Read, HandleInheritability.Inheritable);
Console.WriteLine("ok - open");
}
catch
{
FileStream fs = null;
try
{
fs = new FileStream(fname, System.IO.FileMode.Open, FileAccess.Read, FileShare.Read, 4 * 1024, true);
mmf = MemoryMappedFile.CreateFromFile(fs, mmfName, 0, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false);
Console.WriteLine("ok - load");
}
catch
{
Console.WriteLine("fail");
}
}
}
var size = new System.IO.FileInfo(fname).Length;
byte* ptr = (byte*)0;
var vh = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read).SafeMemoryMappedViewHandle;
vh.AcquirePointer(ref ptr);
var rnd = new Random();
for (int i = 0; i < size; i++)
{
var t = *(ptr + (int)rnd.Next(0, (int)size));
}
}
и код для запуска теста:
static unsafe void Main(string[] args)
{
Parallel.Invoke(T, T, T);
Console.WriteLine("done");
Console.ReadLine();
}
вывод приложения:
ok - load
ok - open
ok - open
Проблема в том, что мое приложение занимает 3 ГБ в памяти (рабочий набор). Таким образом, он копирует файл 3 раза в память. Я хочу только одну копию в памяти (1 ГБ) для потока "ok - load" и никаких копий для чтения ("ok - open") потоков.
Есть идеи? (C#, 4.5, vs12, win7)
Спасибо за помощь