2

我需要分配相当大的内存块(或多个块) - 几 GB。但是,如果我尝试分配超过532000000 个元素(~2 Gb)的浮点数组,则会出现运行时错误:

在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc

还行吧:

float* d = new float[532000000];

但这很糟糕(bad_alloc异常):

float* d = new float[533000000];

然后我尝试分配除第一个数组之外的另一个数组。发现第二个浮点数组的最大大小为195000000个元素(~748 Mb)。

还行吧:

float* d = new float[532000000];
float* e = new float[196000000];

这是不好的:

float* d = new float[532000000];
float* e = new float[197000000];

我想知道应用程序中分配的内存有哪些限制以及如何避免它们?如何使用虚拟内存?

我的系统 - 32 位 ubuntu 12.10,编译器 - gcc 4.7,RAM - 8GB(约 6.5 Gb 可用)

4

1 回答 1

5

您达到了虚拟地址空间的限制;即使你有足够的物理内存(操作系统可能可以通过 PAE 访问,使用 36 位指针),在 32 位系统上,每个进程仍然有一个 32 位虚拟地址空间,这意味着每个进程不能映射在内存中超过 4 GB 的内存。

由于通常虚拟地址空间的上半部分(或上半部分 1 GB,这取决于内核设置)是为内核保留的,因此您通常会将分配限制设置为 ~2 GB,而虚拟地址空间碎片可以降低此值数字。

有多种解决方法(例如,在 Windows 上,您可以使用大于 4 GB 的内存映射文件,一次只映射其中的一部分;可能在 Linux 上您也可以这样做),但目前最简单的解决方案是移动到 64 位操作系统并重新编译 64 位应用程序。

于 2013-09-28T23:43:41.980 回答