Как предотвратить сохранение одного и того же файла несколько раз в памяти

Я хочу читать файлы (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)

Спасибо за помощь

0 ответов

Другие вопросы по тегам