Gus*_*sky 8 c c++ windows memory-management
在Windows 32位和64位计算机上,我必须分配内存来存储大量实时流式传输的数据,总共大约1GB.如果我使用malloc(),我将获得一个虚拟内存地址,这个地址可能实际上导致一些分页到硬盘驱动器,具体取决于我有多少内存.不幸的是,我担心HD会影响性能并导致数据丢失.
有没有办法强制内存只在RAM中分配,即使这意味着当没有足够的内存可用时我会收到错误(因此用户需要关闭其他内容或使用其他机器)?我想保证所有操作都在内存中完成.如果失败,则强制应用程序退出是可以接受的.
我知道另一个进程可能会进入并且本身需要一些内存,但我并不担心,因为在这台机器中没有发生(它将是机器上唯一一个进行大量分配的应用程序).
[编辑:]到目前为止,我的尝试是尝试使用VirtualLock,如下所示:
if(!SetProcessWorkingSetSize(this, 300000, 300008))
printf("Error Changing Working Set Size\n");
// Allocate 1GB space
unsigned long sz = sizeof(unsigned char)*1000000000;
unsigned char * m_buffer = (unsigned char *) malloc(sz);
if(m_buffer == NULL)
{
printf("Memory Allocation failed\n");
}
else
{
// Protect memory from being swapped
if(!VirtualLock(m_buffer , sz))
{
printf("Memory swap protection failed\n");
}
}
Run Code Online (Sandbox Code Playgroud)
但是工作集的更改失败了,VirtualLock也是如此.Malloc确实返回非null.
[Edit2]我也试过了:
unsigned long sz = sizeof(unsigned char)*1000000000;
LPVOID lpvResult;
lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);
Run Code Online (Sandbox Code Playgroud)
但是lpvResult是0,所以也没有运气.
小智 6
您可以使用mlock,mlockall,munlock,munlockall函数来防止页面被交换(POSIX的一部分,也可以在MinGW中使用).不幸的是,我没有使用Windows的经验,但看起来VirtualLock做同样的事情.
希望能帮助到你.祝好运!