繁体   English   中英

为什么windows第一次打开文件这么慢,有没有更快的方法

[英]Why is windows so slow in opening files first time and is there a faster way

这是 Windows 7,64 位,专业版使用

考虑一个非常简单的循环

for (i = 0; i < names->size(); i++)
{
    std::string Name = names->at(i);
    HANDLE fileHandle = CreateFile(Name.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    if (fileHandle == INVALID_HANDLE_VALUE)
    {
        throw "Failed";
    }

    CloseHandle(fileHandle);
}

如果我在一个包含 863 个文件的目录上运行它,它需要稍微超过 22 秒,或 25 毫秒/文件。 下一次 169 毫秒或 0.19 毫秒/文件。 如果我只是在新目录上使用 find_file 时间非常快,大约 0.2 毫秒/文件。 虽然我在这里使用了 CreateFile,但其他方法会产生相同的结果。

答案当然是文件缓存:windows 必须缓存文件打开的信息。 此外,它必须是磁盘访问,就好像目录在 SSD 上一样,第一次和第二次打开大致相同。

现在这些硬盘驱动器上的寻道时间只有 9 毫秒,所以有人知道当打开/关闭文件只读取而不读取需要 25 毫秒时,WINDOWS 在做什么。 但更重要的是,是否有可能加快速度。 你可能会说25ms很快,但是我在播放视频文件,所以我需要在33ms左右读取,而实际读取数据在30ms范围内,所以打开成本太高了。

任何有关如何快速打开* * 文件加载的建议将不胜感激。

当您打开文件时,Windows 会在幕后做了很多事情 我不是专家,但我可以提到文件系统维护(更新访问时间、日志等)和访问权限检查是两个重要项目。 不幸的是,我认为您无法更快地完成此操作。

当然,如果您不打算从文件中读取任何内容,而只是检查文件是否存在或读取一些元数据(例如修改时间),则有更快的方法可以在不打开文件的情况下执行此操作。

我不认为这个答案应该被检查为已接受。 最初的问题是“为什么它第一次打开时很慢”。 操作系统必须做同样的维护/日志/检查/等。 在文件上,无论是第一次还是第二十次。

我在java下看到了完全相同的东西。 第一次运行一个程序,一个接一个地打开 4000 个文件,分析器显示我在 sun.nio.fs.WindowsNativeDispatcher.CreateFile0[native] (long, int, int, long, int , 整数)。

然后,如果我立即再次运行它,它的运行速度将提高 20 倍,并且分析器显示我什至没有使用 CreateFile。 事实上,JVM 正在选择完全不同的对象和方法来完成 Files.readAllLines 调用。

我怀疑 OP 经历了类似的事情,而不是常规的操作系统维护要求。

你可以做一些事情。 一种是,如果您知道很快将再次阅读这些文件,请在打开初始文件后保持这些文件的打开状态。 另一种方法是将它们的数据缓存在内存中,只打开它们以保存更改。 这仅在您不希望其他程序更改文件时才有效。

如果您期望它们被其他程序更改,您仍然可以使用第二种方法将它们的内容保存在内存中,然后定期检查修改时间。 如果已更改,请再次加载它们。

它们第二次加载速度更快的原因是它们的数据被放入缓存中,由硬盘驱动器本身或操作系统,或两者的某种组合,取决于您的硬件和设置,所以第二次打开它们时,它不是从驱动器中读取,而是从内存中读取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM