使用内存映射文件的缺点

时间:2014-03-25 09:38:57

标签: c# .net performance .net-4.0 memory-mapped-files

我的网络服务每分钟写入数千个交易,我们将它们保存在高清上。

我正在测试保存这些文件的不同方法,我使用标准IO和MemoryMapped文件进行了一些测试。在我的结果中,使用MemoryMapped文件编写文件(20 k文本文件)比标准IO快4倍,我无法找到任何缺点。

由于我对这项技术没有那么多经验,你认为我可能会遇到任何使用它们的问题,或者你没有看到任何不利之处?

谢谢!

编辑1 ,这里是来源:

namespace FileWritingTests.Writers {
    public class MappedFileWriter : ITestWriter {
        public void Write(string content, string path,string id) {
            Byte[] data = System.Text.Encoding.UTF8.GetBytes(content);

            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None))

            using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, id, data.Count(),
                MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true)) {
                var viewStream = memoryMapped.CreateViewStream();
                viewStream.Write(data, 0, data.Length);                       
            }
        }
    }
}

这是测试人员:

  public TimeSpan Run(int iterations, Writers.ITestWriter tester, String subfolder) {
            Console.WriteLine(" -- Starting test {0} with {1} file writings",subfolder, iterations.ToString());

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Reset();
            stopWatch.Start();
            for (int i = 1; i <= iterations; i++) {
                tester.Write(transaction, this.path + "\\" + subfolder + "\\" + "file_" + i.ToString() + ".txt", i.ToString());
            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;

            Console.WriteLine(" -- finish test {0} with {1} file writings. Time Elapsed: {2}", subfolder, iterations.ToString(), ts.TotalMilliseconds);
            return ts;
        }

多次调用测试仪,有几种类型的测试仪需要进行比较。

1 个答案:

答案 0 :(得分:16)

MMF的主要缺点是它们消耗RAM,使文件系统缓存效率降低。这些小文件不是问题。

另一个缺点,虽然肯定是故意的,但你无法再衡量编写文件的成本。现在这是由内核完成的工作,而不是你的程序。当然,它仍在进行,没有免费的午餐。它与程序的其余部分同时执行,可以说是免费线程。请关注任务管理器中“系统”进程的CPU利用率。同样,这些小文件也不太可能出现问题。

这是一种微观优化,被创建文件的成本所震撼。在主轴磁盘驱动器上盘旋20到50毫秒。不要忘记在测量中包含它。写入文件数据的速度是内存总线速度,高达5千兆字节/秒,具体取决于机器的RAM类型。你删除的只是低级WriteFile()调用,它们现在由内核完成。您可以尝试使用FileStream进行测试,使用带有 bufferSize 值的构造函数。默认值为4096字节,将其增加到32K,因此只有一个WriteFile()调用。这样做的主要优点是你不必预先猜测MMF的大小。当你猜得太低时,它变得非常难看。