如果我需要经常从一个文件中读取,并且我会使用 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/