在Windows 32位和64位机器上,我需要分配内存来存储大量实时流数据,总计约1GB。如果我使用malloc(),我将获得一个虚拟内存地址,这个地址可能会导致一些页面交换到硬盘,具体取决于我拥有的内存量。不幸的是,我担心硬盘会影响性能并导致数据丢失。
是否有一种方法可以强制内存仅在RAM中分配,即使这意味着在没有足够内存可用的情况下会出现错误(因此用户需要关闭其他应用程序或使用另一台机器)?我想保证所有操作都将在内存中完成。如果失败,强制应用程序退出是可以接受的。
我知道另一个进程可能会占用一些内存,但我不担心,因为在这台机器上没有发生这种情况(它将是该机器上唯一执行此大型分配的应用程序)。
[编辑:] 迄今为止,我的尝试是尝试使用VirtualLock,如下所示:
但是工作集的更改失败了,VirtualLock 也是如此。 Malloc 返回非空值。
[编辑2] 我也尝试了:
是否有一种方法可以强制内存仅在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 返回非空值。
[编辑2] 我也尝试了:
unsigned long sz = sizeof(unsigned char)*1000000000;
LPVOID lpvResult;
lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);
但是lpvResult的值为0,所以那里也没有运气。