我使用的是配备 4 核 Intel i7 和 8 GB RAM 的 Windows 7 x64,但最近感觉我电脑的“RAM”完全位于硬盘上。
以下是任务管理器显示的内容:
列表中进程使用的总内存量约为 1 GB。而几天来,我的电脑上发生的事情是,一个程序 (Cataloger.exe) 不断处理大量文件(每个文件约 5-10 MB),反复打开和读取这些文件以进行编目。但它占用的内存不会太多,并且保持在 100 MB 左右。然而,它在 30 分钟内处理的数据量可以以 GB 为单位来衡量。
所以我猜想 Windows 文件缓存与此有关。在对这个主题进行一些研究之后,我偶然发现了一个名为 RamMap 的程序,它可以显示计算机 RAM 的详细信息。以下是屏幕截图:
因此在我看来,Windows 似乎在 RAM 中保存了大量不再需要的数据,并将任何 RAM 分配请求重定向到硬盘上的页面文件。即使我关闭 Cataloger.exe,RamMap 也会报告映射文件的大小在很长时间内大致相同。而且这不仅仅是这个特定的程序。之前我注意到,在使用其他程序进行一些大规模文件操作后,也出现了类似的减速。所以这真的不是 Cataloger.exe 的异常行为,这个问题在过去出现过很多次。
不管是什么,它都会使计算机速度减慢 50 倍。在 Chrome 中打开新标签需要 20-30 秒,打开新程序可能需要一分钟。由于速度减慢,某些程序甚至会崩溃。
那么你认为问题出在文件缓存中还是其他地方?我该如何解决?
答案1
这只是正常业务,一切都正常。Windows 不会将缓存文件保存在内存中而不是其他数据上 - 缓存文件意味着在某一时刻,Windows有将它们加载到内存或从磁盘读取,从那时起就没有出现更高优先级的东西。只要您恢复使用计算机并且程序请求内存,Windows 就会很乐意删除缓存的文件以腾出空间。
如果你看一下 RAMMap,你会注意到大多数缓存文件都分配在“待机”下 - 这意味着它被保存在内存中,因为 Windows 过去需要它,可能再次需要它,并且如果发生其他情况,它会很乐意丢弃它实际上需要空间。
基本上,您在这里看到的是您的程序请求加载一个大型数据文件,因此 Windows 将其加载到内存中。管理内存是一个非常复杂的过程,而 Windows 在这里所做的是做出判断:它查看当前进程,发现 Chrome 占用了 5GB 内存(很多标签!),但大部分内存在过去一个小时内都没有被使用过。此时,它有一个选择:它可以将 Chrome 留在内存中,而不缓存文件。这意味着 Cataloger 进程可能需要数小时而不是数分钟来处理文件,特别是如果它在文件中跳来跳去很多;或者,它可以分页出 chrome 标签并将 Cataloger 文件加载到内存中,并快速完成该过程。
现在,当 Windows 必须将 chrome 重新分页到内存中时,您会感到很痛苦,但 Windows 不会这样做,除非您提出请求(即,将 chrome 重新带回前台并选择已分页的选项卡),而您最终需要评估的是,这种痛苦是大于还是小于 Cataloger 任务必须等待内存的痛苦。您可以尝试将程序作为服务运行,并告诉 Windows 优化响应能力,或者尝试降低进程优先级,但我很确定您想要的是 Cataloger 进程尽快完成 - 当它最大限度地利用您的磁盘 I/O 时,您的整个系统将变得非常缓慢。所有需要磁盘 I/O 的操作都将被放入队列中(甚至是网页浏览 - 它也使用缓存!)。程序打开很慢,新选项卡打开很快,但实际使用它们进行某些操作会很慢。
如果程序只是按顺序读取一个又一个文件,然后不再接触它们,我同意 Windows 不需要缓存这些文件。这里的问题是 Windows 不知道这一点,因为没有人告诉它这些文件不需要缓存。
如果您有权访问 Cataloger 程序的源代码(或可以请求对其进行修改),则可以将其配置为使用 打开文件FILE_FLAG_NO_BUFFERING
,这将导致 Windows 跳过程序以这种方式打开的文件的磁盘缓存。
如果这不是一个选项,那么除非 Cataloger 进程有在您的系统上运行,我会四处看看是否有一台闲置的计算机,看看是否可以将其设置为专门用于对这些文件进行分类的机器。如果还没有,简单地增加您的 RAM 可能是另一种选择;现在内存价格相当便宜,开发人员也知道这一点 - 大多数东西都是以内存为代价来优化速度和响应能力的。8GB 已经不像以前那样了。
另一个选择是将其使用的所有文件移动到单独的硬盘上,并专门关闭该驱动器的磁盘缓存。
答案2
我也遇到了同样的问题,它是一个名为“intellimem.exe”的进程,我删除了它,然后就好了!从 80% 的 RAM 和页面文件到没有页面文件和 20% 的 RAM 使用率!我没有遇到任何问题。