0

我想通过使用来自几个线程(和进程!)的 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();
    }

应用程序输出:

ok - load
ok - open
ok - open

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

有任何想法吗?(c#, 4.5, vs12, win7)

感谢帮助

4

0 回答 0