在 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");
}
}
但是工作集的更改失败了,VirtualLock 也是如此。Malloc 确实返回非空值。
[Edit2] 我也试过:
unsigned long sz = sizeof(unsigned char)*1000000000;
LPVOID lpvResult;
lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);
但是 lpvResult 是 0,所以也没有运气。