WIn64内存映射文件和锁定页面

时间:2011-11-25 18:05:38

标签: c++ windows performance memory-management 64-bit

我需要实时获取大量(4-8Gb)数据 - 不会丢失任何数据。

旧系统可能只是跟上将数据写入条带化RAID阵列,但数据变得更大,速度更快(!)因此我没有时间访问磁盘。登记/> 新的计划是切换到Win64,安装LOTS ram,将传入的数据填入缓冲区,然后在最后写入。

所以我在寻找:
一个Windows API,它将new []限制为物理内存并将页面锁定为物理ram,或者我只是禁用页面文件。

或者我使用内存映射文件并在关闭文件时强制执行同步。是否存在一个内存映射文件标志,在我准备好之前会阻止写入?

3 个答案:

答案 0 :(得分:5)

您需要做的是重载operator new并自行分配和锁定该内存。

  1. 调用VirtualAlloc分配你的内存块。
  2. 调用VirtualLock将这些页面锁定到物理RAM。请注意,有时候很难说服Windows执行此操作,但如果您有足够的RAM并且已使用SetProcessWorkingSetSize正确设置了流程工作集大小,则通常会有效。请注意特殊PROCESS_SET_QUOTA permission the user account your process is running under will need

答案 1 :(得分:1)

您可以使用VirtualAlloc参数调用VirtualAlloc,而不是使用普通的旧MEM_LARGE_PAGES并自行锁定页面。您需要事先设置一些设置:See here

默认情况下,大页面不可分页,显然开销更高效。请注意,大型页面的分配时间可能会在碎片堆上出现问题。您可能还想阅读this

答案 2 :(得分:0)

一种快速方法是禁用系统分页文件系统。您可以为数据创建一个特殊的堆,它只使用物理内存,但是用于处理小块数据的内存管理的新/删除内容通常使用进程堆。使用win api中的HeapCreate()函数。现在你必须得到new / delete才能使用那个堆。