如何dynamic地分配大内存,如10 G,在64-linux上使用c ++的新操作符?

我需要dynamic分配一个更大的浮点数组为一个特殊的应用程序使用C + +新操作符,如10G。 运行在64-ubuntu-14.04 Linux OS上的代码,带有64G内存。 当我把内存的请求设置为大约7G, 1879048192x4/(1024x1024x1024)=7G (浮点数有4个字节),像这样:

 float * data; data = new float[1879048192]; 

程序运行良好,但是当我尝试增加对10G的请求时,我得到了一个what(): std::bad_alloc 。 我也尝试使用malloc()来取代新的操作符:

 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的连续内存分配,但是我closures了所有其他的进程,总内存是64G。 我想知道我是否可以获得这个更大的数组,以及如何。 Linux是否限制这个dynamic分配的最大数量? 在哪里和如何?

我尝试时没有看到问题。 newmalloc工作。 我的系统运行Ubuntu 15.04,并有16G的RAM。

但是,如果我尝试使用内存,我发现我需要非常小心用于索引到数据数组中的变量类型。

例如,下面的程序只能用long intfloat来做不好的事情,因为long int的最大值是2^31 ,而10Gi的数组长度会比2^31 。 此外,浮动只能一次添加1.016777216.0 。 有了双打,在这里使用long int索引是可以的,因为数组更短。

use10G.c ++

 #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ long long int ten = 10; long long int megi = 1024*1024; long long int gigi = 1024*megi; long long int asize = (ten*gigi)/((long int) sizeof(double)); double * data = new double[asize]; long long int i=2; printf("A double is %zd bytes\n", (size_t) sizeof(double)); printf("Array size is %lli \n", asize); data[0]=0.0; data[1]=1.0; while (i<asize) { data[i]=data[i-1]+1.0; ++i; } printf("%lf\n", (double) data[asize-1]); printf("success\n"); exit(EXIT_SUCCESS); } A double is 8 bytes Array size is 1342177280 1342177279.000000 success