我需要使用C++的new运算符为一个特殊应用程序动态分配较大的浮点数数组,例如10G。代码在64-ubuntu-14.04 Linux操作系统上运行,具有64G内存。
当我将内存请求设置为约7G时,1879048192x4/(1024x1024x1024)=7G
(float占用4个字节),就像这样:
float * data;
data = new float[1879048192];
程序运行良好,但当我尝试将请求增加到10G时,我遇到了一个
what(): std::bad_alloc
的错误。 我还尝试使用malloc()
代替new运算符:data =(float*)malloc(1879048192*sizeof(float));
但是要获得相同的结果。我的
ulimit -a
是这样的:core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 514689
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 514689
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
有人可能会说,可能没有10G的连续内存可以分配,但我关闭了所有其他进程,总内存为64G。我想知道是否可以获取这个更大的数组,以及如何获取。Linux是否限制了动态分配的最大数量?在哪里以及如何解决?