代码之家  ›  专栏  ›  技术社区  ›  Canopus

WinXP中文件的内存映射和系统缓存行为

  •  3
  • Canopus  · 技术社区  · 16 年前

    我们的应用程序是内存密集型的,需要读取大量磁盘文件。总负载可以超过3 GB。

    有一个自定义内存管理器,它使用内存映射文件来读取如此庞大的数据。只有在需要时,文件才会映射到进程内存空间,这样进程内存就可以得到很好的控制。但观察到的是,通过内存映射,系统缓存会不断增加,直到它占用可用的物理内存。这会导致整个系统的速度减慢。

    我的问题是如何防止系统缓存占用物理内存?我试图删除文件缓冲(通过使用file_FLAG_NO_buffering),但这样做会占用大量时间,降低应用程序性能。如何在不牺牲性能的情况下实现可伸缩性。在这种情况下,常用的技术是什么?

    我对WinXP操作系统的缓存行为不是很了解。任何好的链接都会对你有所帮助。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Ivan Bohannon    15 年前

    我在一个文件备份产品上工作,所以我们经常遇到类似的情况,我们自己的文件访问会导致缓存管理器保留数据,这可能会导致内存使用激增。

    默认情况下,windows缓存管理器将通过提前读取并保留文件数据以备再次需要来发挥作用。

    有几个注册表项可以让您调整缓存行为,我们的一些客户在这方面取得了很好的效果。

    XP的独特之处在于它有一些服务器功能,但默认情况下是针对桌面程序而不是缓存进行优化的。您可以在XP中启用系统缓存模式,这会为缓存留出更多内存。这可能会提高性能,或者您可能已经这样做了,并且会产生负面的副作用!你可以读一下 here

    我不能推荐一个自定义内存管理器,但我知道大多数重量级应用都有自己的缓存(Exchange、SQL)。你可以通过跑步来观察 process monitor.

    文件\u标志\u无\u缓冲和 文件标志写入

    您还可以向CM(随机访问,临时文件)提供其他提示,以阅读有关缓存行为的本文档 here

    即使禁用缓存,您仍然可以获得良好的读取性能,但是您必须通过让自己的后台线程进行读取来模拟缓存管理器的行为

    此外,我建议升级到服务器级操作系统,即使windows 2003也将为您提供更多的缓存管理器调优选项。当然,如果您可以迁移到Windows 7/Server 2008,那么在相同物理资源的情况下,由于动态分页/非分页池大小和工作集的改进,您将获得更大的性能改进。这方面有一篇很好的文章 here

        2
  •  1
  •   Nagaraj    14 年前

    在记事本中键入并另存为。vbs文件。只要你意识到系统内存太低,就运行它。系统缓存将被清除并添加到RAM中。我在网上的其他地方找到了它,并把它放在这里,这样可能会对你有所帮助。此外,建议注意第一条记录不应超过实际RAM的一半。因此,如果您有1GB ram,请从vbs文件中的以下文本开始。

    FreeMem=Space(240000000) <This one is to clear 512 MB ram> 
    FreeMem=Space(120000000)  <This one is to clear 256 MB ram>   
    FreeMem=Space(90000000)   <This one is to clear 128 MB ram> 
    FreeMem=Space(48000000)  <This one is to clear 64 MB ram> 
    FreeMem=Space(20000000)   <This one is to clear 52 MB ram>