c++ - Windows C++ 在内存中锁定文件

标签 c++ windows caching filesystems fread

如果我需要经常从一个文件中读取,并且我会使用 fread 将文件加载到一个 unsigned char vector 中,由此产生的 fread 非常快,即使 unsigned char vector 在读取后立即销毁。

在我看来,某些东西(Windows 或磁盘)缓存了文件,因此 freads 非常快。我没有读到任何关于这种行为的信息,所以我不确定是什么导致了这种情况。

如果我在 1 小时左右不使用我的应用程序然后再次执行 fread,则 fread 很慢。 在我看来缓存被清空了。

有人可以向我解释这种行为吗?我想积极使用它。 当 freads 很慢时,这对我来说是个问题。

内存映射文件理论上可行,但文件本身太大,所以我不能使用它。

最佳答案

90/10法则

90% of the execution time of a computer program is spent executing 10% of the code

这不是规则,但通常是这样,所以很多程序会尽可能保留最近的数据,因为很可能很快就会再次访问这些数据。

Windows 操作系统也不异常(exception),在接收到读取文件的命令后,操作系统会保留一些关于文件的数据。它在存储程序的年龄的内存地址中存储,如果可能的话甚至将部分(甚至全部)二进制数据存储在内存中,如果读取就在第一个文件之后,它会使下一个文件的读取速度更快。

总而言之,缓存是正确的,但我不能说,这真的发生了,因为我不在 Microsoft 工作...


同时回答问题的下一部分。文件映射到内存可能是解决方案,但如果文件非常大,机器可能没有足够的内存,所以它不是一个选项。但是,您可以使用 90/10 法则。在你的情况下,你应该只将文件的一部分映射到内存中(那部分是最重要的),而且在阅读时你应该制作一个整体参数的数据表。

不知 Prop 体情况,但可能会省。

关于c++ - Windows C++ 在内存中锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326243/

相关文章:

C++ 缓存感知编程

PHP 部署到 windows/unix 服务器

c# - 如何在 C# 中实现内存事务作用域?

Android picasso 缓存图片

caching - 缓存抖动,一般有助于理解

c++ - 在命名空间的类中,我可以**仅**类命名空间退出吗?

c++ - 是否可以使用 SSE 对此嵌套进行矢量化?

c++ - 处理多种功能和参数

windows - 如何为 Windows 命令 DIR 设置递归深度?

c++ - OpenGL Performer 最简单的移植路径?