快速RAM中的动态内存分配
Dynamic Memory Allocation in fast RAM
在Windows 32位和64位机器上,我必须分配内存来存储大量实时流数据,总共大约1GB。如果我使用malloc(),我将获得一个虚拟内存地址,根据我拥有的内存量,这个地址实际上可能会对硬盘驱动器进行一些分页。遗憾的是,我担心高清会影响性能并导致数据丢失。
是否有一种方法来强制内存分配仅在RAM中,即使这意味着我得到一个错误时,没有足够的内存可用(所以用户需要关闭其他东西或使用另一台机器)?我想保证所有的操作都在内存中完成。如果失败,可以强制应用程序退出。
我知道另一个进程可能会进入并占用一些内存,但我并不担心,因为在这台机器上没有发生这种情况(它将是机器上唯一一个做这么大分配的应用程序)。
[编辑:]到目前为止,我一直在尝试使用VirtualLock,如下所示:
if(!SetProcessWorkingSetSize(this, 300000, 300008))
printf("Error Changing Working Set Sizen");
// 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 failedn");
}
else
{
// Protect memory from being swapped
if(!VirtualLock(m_buffer , sz))
{
printf("Memory swap protection failedn");
}
}
但是Working set的更改失败了,VirtualLock也失败了。Malloc不返回非空。
[Edit2]我也试过了:
unsigned long sz = sizeof(unsigned char)*1000000000;
LPVOID lpvResult;
lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);
但是lpvResult是0,所以也没有运气
您可以使用mlock, mlockall, munlock, munlockall函数来防止页面被交换(POSIX的一部分,也可在MinGW中使用)。不幸的是,我没有Windows的经验,但看起来VirtualLock做同样的事情。
希望有帮助。好运!
我认为VirtualAlloc可能会给你一些你想要的。
这个问题归结起来就是你自己写内存管理器而不是使用CRT函数。
您需要使用未记录的NtLockVirtualMemory
函数和锁定选项2 (LOCK_VM_IN_RAM
);请确保您首先请求并获得SE_LOCK_MEMORY_NAME
特权,并注意它可能不会被授予(我确定组策略默认的特权是什么,但它很可能不被授予任何人)。
我建议使用VirtualLock
作为回退,如果这也失败,使用SetProcessWorkingSetSize
。如果失败了,那就让它失败吧。
请参阅此链接以了解有关此问题的一些精彩讨论。一个人说:
当您指定
LOCK_VM_IN_WSL
标志时,您只需告诉Balance Set Manager您不希望某些特定的页面被交换到磁盘上,并要求它在修剪目标进程的工作集时单独留下此页面。这只是一个指示,以便在系统RAM不足时仍然可以交换目标页。然而,当您指定LOCK_VM_IN_RAM
标志时,您向内存管理器发出指令,将该页视为不可分页(即做驱动程序在调用MmProbeAndLockPages
()以锁定页面时所做的事情,由MDL描述),以便保证该页始终加载在RAM中。
编辑:
读。
一种选择是从主机的内存中创建一个RAM磁盘。虽然在分布式Windows代码中不再有对此的原生支持,但您仍然可以找到免费或通过商业产品提供的必要驱动程序。例如,DRDataRam提供个人使用的免费驱动程序和商业使用的商业许可产品:http://memory.dataram.com/products-and-services/software/ramdisk
也有ImDisk虚拟驱动器可用:http://www.ltr-data.se/opencode.html/#ImDisk它是开源的,免费用于商业用途。使用Microsoft的可信证书对其进行数字签名。
有关Windows上RAM驱动器的更多信息,请查看ServerFault.com。
你应该看看地址窗口扩展(AWE)。听起来它符合你的内存限制(强调我的):
AWE在32位虚拟地址空间中使用物理非分页内存和该物理内存各部分的窗口视图。
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配