MemoryMappedFile导致下一个File.Open需要很长时间

时间:2016-02-11 13:41:44

标签: c# memory-mapped-files

我正在使用内存映射文件来访问大文件。在研究与标准I / O文件访问机制相比的性能时,我注意到一种不寻常的行为,我目前无法解释。 使用带有MemoryMappedFileAccess.ReadWrite标志的内存映射访问3GB大文件后,即使我只打开文件FileStream,也需要大约9秒再次打开文件。使用MemoryMappedFile后对文件的下一次访问速度很慢。即使没有定义ViewAccessors,也不会向文件写入任何内容。如果我使用Read标志创建MemoryMappedFile,则不会发生此行为,下一次打开操作只需要大约一毫秒。

我读到脏页面可能无法写入磁盘,直到地图不再使用,但考虑到我没有写任何文件,而且进程是唯一一个使用内存映射我不明白为什么这仍然发生。

我测试了这段代码:

static void Main(string[] args)
{
    TestFileOpen();
    TestMMF();
    TestMMF();
    TestFileOpen();
    TestFileOpen();
    TestMMF();

    Console.WriteLine("Finished.");
    Console.ReadKey();
}

private static void TestMMF()
{
    Console.Write("Open Memory Mapped File... ");
    const long size = 1024L*1024L*3000L;

    Stopwatch sw = Stopwatch.StartNew();

    using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
    using (MemoryMappedFile.CreateFromFile(stream, "Map", size, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.None, true))
    {
    }

    Console.WriteLine(sw.Elapsed.TotalSeconds);
}

private static void TestFileOpen()
{
    Console.Write("Open File Stream...        ");

    Stopwatch sw = Stopwatch.StartNew();
    using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
    }

    Console.WriteLine(sw.Elapsed.TotalSeconds);
}

这给了我:

Open File Stream...        9,2946138
Open Memory Mapped File... 0,0003105
Open Memory Mapped File... 9,2050714
Open File Stream...        9,2130051
Open File Stream...        0,0001751
Open Memory Mapped File... 0,0001529
Finished.

请注意,使用FileStream后的调用会很快,使用MemoryMappedFile后调用会花费很长时间。 另请注意,第一次调用也需要很长时间,因为基准程序中的最后一次调用(应用程序的上一次运行!)使用内存映射访问该文件。

我错过了什么吗?我能做些什么来阻止这种情况吗?

1 个答案:

答案 0 :(得分:1)

根据评论中的确定,此延迟是由反病毒软件引起的。