gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:39:35 24 4
gpt4 key购买 nike

我正在尝试使用内存映射文件来访问大文件。在研究与标准 I/O 文件访问机制相比的性能时,我注意到一个我目前无法解释的异常行为。在使用带有 MemoryMappedFileAccess.ReadWrite 标志的内存映射访问一个 3GB 的大文件后,再次打开该文件需要大约 9 秒,即使我只是打开一个 FileStream文件。使用 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后调用会比较长。另请注意,第一次调用也需要很长时间,这是因为基准程序中的最后一次调用(应用程序的前一次运行!)使用内存映射访问了文件。

我错过了什么吗?我可以做些什么来防止这种情况发生吗?

最佳答案

如评论中所述,此延迟是由防病毒软件引起的。

关于c# - MemoryMappedFile 导致下一个 File.Open 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com