如何防止在内存中多次保存同一文件

时间:2013-09-11 18:44:02

标签: c# memory-mapped-files

我想通过使用来自几个线程(和进程!)的MemoryMappedFile来读取每个字节的文件(1 gb),我的示例代码:

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

app输出:

ok - load
ok - open
ok - open

我的应用程序在内存中占用3 GB的问题(工作集)。所以它在内存中复制文件3次。我想在内存(1 gb)中只有一个副本用于“ok - load”线程,而没有用于读取(“ok - open”)线程的副本。

有什么想法吗? (c#,4.5,vs12,win7)

感谢您的帮助

0 个答案:

没有答案