【问题标题】:Memory mapped file and memory consumption内存映射文件和内存消耗
【发布时间】:2013-07-31 22:46:55
【问题描述】:

给定以下测试代码(x64 环境):

    static void Test()
    {
        string fileName = @"d:\map";
        long length = new FileInfo(fileName).Length;
        using (var file = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "mapFile", length, MemoryMappedFileAccess.ReadWrite))
        {
            byte* bytePtr = (byte*)0;
            var view = file.CreateViewAccessor(0, length, MemoryMappedFileAccess.ReadWrite);
            view.SafeMemoryMappedViewHandle.AcquirePointer(ref bytePtr);

            long count = (long)(length / sizeof(int));
            long sum = 0;
            long step =  count / 2000;

            int* ptr = (int*)&bytePtr[0];
            long currentCount = 0 ;

            Parallel.For(0, count, new ParallelOptions { MaxDegreeOfParallelism = 8 }, (i) =>
            {
                Interlocked.Add(ref sum, ptr[i]);
                Interlocked.Increment(ref currentCount) ;

                if (currentCount % step == 0)
                    Console.Write("\r{0:0.00}%", (100 * currentCount / (float)count));
            });

            Console.WriteLine(sum);

            view.Dispose();
        }
    }

鉴于“d:\map”是一个 40GB 的文件,当通过指针“ptr”进行随机访问时会出现非常奇怪的行为。

系统物理内存得到充分利用,一切都变慢了,这个过程需要 2 个多小时才能完成。

当我有顺序(和单线程)访问时,使用的物理内存不会超过 1GB,并且该过程大约需要 8 分钟。

我的问题是:使用内存映射文件时,“真实”内存是否会被使用?被占用的不只是虚拟地址空间吗?

我正在尝试了解使用内存映射文件时的物理内存消耗。

【问题讨论】:

    标签: c# memory-mapped-files


    【解决方案1】:

    内存映射文件使用虚拟内存。与 64 位操作系统上的 RAM 相比,映射更多 GB 的 VM 空间不会有任何问题。点页式虚拟内存操作系统,所有运行进程所需的内存总和总是大大超过RAM的量。

    将其映射到 RAM 需要花钱,这就是 需求 发挥作用的地方。当处理器试图访问未映射到 RAM 的虚拟内存地址时,它会中断程序并大声呼救。称为页面错误

    如果您没有将这笔钱花在获得至少 40 GB 的 RAM 上,那么您将不可避免地支付操作系统处理这些页面错误的成本。这需要分配一个 RAM 页面并用文件中的内容填充它。当 Perf 必须取消映射先前映射的 RAM 并将其内容保存到文件时,它会向南。随后重新使用已释放的 RAM 页面并从适当的文件偏移量加载文件内容。很鹿,磁盘很慢。称为“抖动”的问题。

    当您按顺序寻址内存时,问题要小得多,一个页面错误对于 4096 字节的顺序访问是有好处的,而且当您跳闸时,您很有可能磁盘读取器磁头仍然在正确的位置页面错误。

    【讨论】:

    • 我可以将非常大的 1-2Gb 文件映射到我的进程并且该内存将从虚拟内存中获取,这对吗?但无论如何这是否意味着我的进程将消耗 1-2 Gb 的内存?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多