C++ Windows C++;在内存中锁定文件

C++ Windows C++;在内存中锁定文件,c++,windows,caching,filesystems,fread,C++,Windows,Caching,Filesystems,Fread,如果我需要经常读取一个文件,我将使用fread将文件加载到一个无符号字符向量中,那么产生的fread非常快,即使读取后无符号字符向量被销毁 在我看来,某个东西(Windows或磁盘)缓存了文件,因此freads非常快。我没有读过任何关于这种行为的文章,所以我不确定到底是什么导致了这种行为 如果我不使用我的应用程序1小时左右,然后再做一次fread,fread是缓慢的。 在我看来,缓存被清空了 有人能给我解释一下这种行为吗?我想积极使用它。 对我来说,当fread速度慢的时候,这是个问题 内存映射

如果我需要经常读取一个文件,我将使用fread将文件加载到一个无符号字符向量中,那么产生的fread非常快,即使读取后无符号字符向量被销毁

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

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

有人能给我解释一下这种行为吗?我想积极使用它。 对我来说,当fread速度慢的时候,这是个问题

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

90/10定律 计算机程序90%的执行时间用于执行10%的代码

这不是一个规则,但通常是这样的,所以如果可能的话,很多程序都会尝试保留最新的数据,因为这些数据很可能会很快再次被访问

Windows操作系统也不例外,在收到读取文件的命令后,操作系统会保留一些有关文件的数据。它在内存中存储程序存储时间的地址,如果可能的话,甚至可以在内存中存储部分(甚至全部)二进制数据,如果下一个文件的读取正好在第一个文件之后,那么下一个文件的读取速度会快得多

总的来说,有缓存是对的,但我不能说,这是真的,因为我不在微软工作


也回答了问题的下一部分。将文件映射到内存可能是一个解决方案,但如果文件非常大,计算机可能没有太多内存,因此它不是一个选项。但是,您可以使用90/10定律。在您的情况下,您应该只将文件的一部分映射到内存中(这一部分是最重要的),并且在读取时,您应该创建一个包含所有参数的数据表


不知道确切的情况,但它可能会节省。

Windows有一个磁盘缓存,它工作得很好。期望Windows将您的数据在缓存中保留数小时/数天并不是那么友好。是什么让你的数据比系统上任何其他数据都重要?我需要快速执行freads,因此我试图找到一种方法告诉Windows该文件对我很重要,我需要经常快速访问它。只要阅读它。。。它将被缓存。只要你一直在读,windows就应该把它缓存起来。从缓存启动后,您只需点击慢读一次。如果由于文件太大而无法选择内存映射文件,则也无法将其保存在RAM中。但缓存也不可能对您有利。如果您需要的页面不适合RAM(或大于您的地址空间),那么它们也不适合缓存。也就是说,内存映射所需文件的子范围几乎是“强制”操作系统保持这些子范围不变的唯一方法,即使这样,您也不确定,因为您无法锁定许多兆字节。只是可能性更大,不确定。不过,我建议大家不要玩这种把戏。