我们正在开发一个Vista / Windows 7应用程序,使用VS2008 / C ++以64位模式运行。 我们将需要caching数以百计的2-3 MB数据blob的性能的原因达到一定的内存限制。 我们的用法configuration文件是这样的,如果它全部在磁盘上,我们不能够以足够快的速度读取数据。 caching的内存使用量将大于1GB内存使用。 为此,我们需要确保Windows不会将这个内存分页,因为它会挫败我们为什么这样做的目的。
我做了相当数量的研究,找不到说明如何做到这一点的文档。 我已经看到了几个推断内存映射文件的参考。 有没有专家可以为我澄清这一点?
我知道还有其他的程序可以适应这种情况,例如,分割blob并加载到memcache或内存数据库,但是它们在性能或代码复杂性方面都存在太多的问题。
build议?
从用户模式,你不能( 编辑:至少你正在谈论的大小)。 用户模式分配都归结为VirtualAlloc API(在其上写入GlobalAlloc / LocalAlloc / C运行时函数)或内存映射文件 API。 这两个API都不支持,因此在Win32上无法获得。 从内核模式是可能的,但不知何故,我怀疑这是一个用户模式的应用程序:)
请注意,内存管理器不会决定在没有充分理由的情况下分页。
现在,你当然可以,如果你完全控制机器(这是内部使用或其他),禁用有问题的机器上的页面文件,但这似乎并没有解决你的问题。
您可以使用VirtualLock。 但是,您一定会按照您所谈论的金额达到配额。 鉴于你不应该在这台机器上运行任何其他代码,你最好是关闭分页文件。 控制面板+系统+高级。
也许答案? (来自VMWARE教程)
编辑注册表并禁用分页内核模式堆栈
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
。 FLG_DISABLE_PAGE_KERNEL_STACKS
。 希望能帮助到你
看看这个非常类似的问题的答案。
这是可能的! 您可以使用AWE(地址窗口扩展)VirtualAlloc + AllocatePhysicalPages + MapPhysicalPages为用户模式应用程序强制页面锁定内存。
注意:我已经阅读过,您可以使用来自32位或64位应用程序的AWE API,但我只使用32位应用程序。 (当然,因为是AWE,你可以手动重新映射内存来访问大于2GB的内存。)
注意:您必须先拥有seLockMemoryPrivilege。 (到目前为止,这似乎要求应用程序在我的测试中以管理员身份运行。)
注意:使用AWE意味着你可以用这些特定页面的内存做些什么限制,例如没有VirtualProtect()。