首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WIn64内存映射文件和锁定页面

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

Stack Overflow用户
提问于 2011-11-26 02:05:38
回答 3查看 1.8K关注 0票数 3

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

旧系统几乎可以跟上将数据写入条带RAID阵列的速度,但数据变得更大、更快,比磁盘变得更快(!)所以我没有时间访问磁盘。

新的计划是切换到Win64,安装大量的ram,将传入的数据填充到缓冲区中,然后在最后将其全部写入。

所以我在找:

一个windows API,它将new[]限制在物理内存中,并将页面锁定到物理内存中,或者我只是禁用页面文件。

或者我使用内存映射文件,并在结束时关闭文件时强制同步。有没有一个内存映射文件标志,可以在我准备好之前阻止写操作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-26 02:41:47

你需要做的就是重载操作符new,并自己分配和锁定内存。

  1. 调用VirtualAlloc来分配您的内存块。
  2. 调用VirtualLock来将那些页面锁定到物理内存。请注意,有时很难说服windows这样做,但通常情况下,如果你有足够的内存,并且你已经使用SetProcessWorkingSetSize适当地设置了进程工作集大小,那么它就可以工作。请注意特殊的PROCESS_SET_QUOTA permission the user account your process is running under will need.
票数 5
EN

Stack Overflow用户

发布于 2011-11-26 03:14:59

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

默认情况下,大页面是不可分页的,并且显然更有效地增加了wrt开销。注意,在碎片化的堆上,大页面的分配时间可能会出现问题。您可能还想阅读this

票数 1
EN

Stack Overflow用户

发布于 2011-11-26 02:15:44

一种快速的方法是在整个系统范围内禁用系统分页文件。您可以为您的数据创建一个仅使用物理内存的特殊堆,但负责管理小块数据的内存管理的新/删除内容通常使用进程堆。使用win中的HeapCreate()函数。现在,您必须获取new/delete才能使用该堆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8272823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档