我需要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分配的最大数量? 在哪里和如何?
我尝试时没有看到问题。 new
和malloc
工作。 我的系统运行Ubuntu 15.04,并有16G的RAM。
但是,如果我尝试使用内存,我发现我需要非常小心用于索引到数据数组中的变量类型。
例如,下面的程序只能用long int
和float
来做不好的事情,因为long int
的最大值是2^31
,而10Gi的数组长度会比2^31
。 此外,浮动只能一次添加1.0
到16777216.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