2010-04-02 202 views
2

我们正在研究一个使用VS2008/C++以64位模式运行的Vista/Windows 7应用程序。我们将需要将数百个2-3 mb的数据块缓存在内存中,以达到某些内存限制的性能原因。我们的使用情况是这样的:如果所有数据都在磁盘上,我们就无法以足够快的速度读取数据。缓存的内存使用量将大于使用的1GB内存。为此,我们需要确保Windows不会将此内存分页,因为它会挫败我们为什么这样做的目的。如何让页面内存页面保持不变

我已经做了大量的研究,找不到说明如何做到这一点的文档。我见过几个推断内存映射文件的参考文件。有没有专家可以为我澄清这一点?

我知道还有其他程序可以适应这种情况,例如,分割blob并加载到memcache或内存数据库中,但它们在性能或代码复杂性方面都存在太多问题。

对此提出建议?

回答

4

从用户模式,你不能(编辑:至少你所谈论的大小)。用户模式分配都归结为VirtualAlloc API(在其上面写入GlobalAlloc/LocalAlloc/C运行时函数)或Memory Mapped File API。这两个API都不支持,因此在Win32上无法获得。它可能从内核模式,但不知何故,我怀疑这是一个用户模式的应用程序:)

请注意,内存管理器不会决定寻找你的RAM没有很好的理由这样做。

现在,你当然可以,如果你完全控制机器(这是用于内部使用或某物)禁用有问题的机器上的页面文件,但这似乎并没有解决你的问题。

+0

感谢您的答案。这是我无法弄清楚的部分。至于禁用分页文件,我以前从来没有过好运气,虽然我可能必须这样做。 – 2010-04-02 18:29:37

3

您可以使用VirtualLock。但是,您一定会按照您所谈论的金额达到配额。鉴于你不应该在这台机器上运行任何其他代码,你最好关闭分页文件。控制面板+系统+高级。

+1

如果我还有选票,我会+1。忘记了这一点 - 更新我的答案也考虑到了这一点。 – 2010-04-02 18:15:33

2

也许答案? (从VMWARE教程)

编辑注册表和禁用分页内核模式栈

  1. 点击开始>运行,输入regedit。
  2. 在注册表编辑器的左侧窗格中,导航至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
  3. 在右侧窗格中,右键单击GlobalFlag并选择修改。
  4. 使用基本十六进制,键入值80000,对应于FLG_DISABLE_PAGE_KERNEL_STACKS
  5. 单击确定并退出注册表编辑器。
  6. 重新启动来宾系统以使此更改生效。

希望它有助于

0

这是可能的!您可以通过使用AWE(地址窗口扩展)VirtualAlloc + AllocatePhysicalPages + MapPhysicalPages为用户模式应用程序强制页面锁定在内存中。

注:我已阅读,你可以使用AWE的API,无论是从32位或64位的应用程序还,但我只与32位应用程序尝试。 (当然,因为它是亚洲国际博览馆,你可以手动重新映射内存访问> 2GB RAM。)

注意:你必须先有seLockMemoryPrivilege。 (这似乎需要该应用在我的测试管理员跑这么远。)

注意:使用AWE意味着你可以用这些内存特定页面,例如做一些限制没有VirtualProtect()。