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