如何在 64-linux 上使用 c++ 中的新运算符动态分配大内存,如 10 G?
How to dynamically allocate big memory , like 10 G ,using new operator in c++ on 64-linux?
我需要为使用 C++ new 运算符的特殊应用程序动态分配更大的 float 数组,例如 10G。代码运行 on 64-ubuntu-14.04 Linux OS 64G内存。
当我将内存请求设置为大约 7G 时,1879048192x4/(1024x1024x1024)=7G
(float 有 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的连续内存分配,但是我关闭了所有其他进程,总内存为64G。我想知道我是否可以获得这个更大的阵列,以及如何获得。 Linux 是否限制此动态分配的最大数量?地点和方式?
我试了一下没有发现问题。 new
和 malloc
都有效。我的系统运行 Ubuntu 15.04 并且有 16G 内存。
但是,如果我尝试使用内存,我发现我需要非常小心用于索引数据数组的变量类型。
例如,下面的程序只用 long int
和 float
就可以做一些不需要的事情,因为 long int
的最大值为 2^31
并且数组长度对于 10Gi,将比 2^31
长。此外,浮动每次只将 1.0
添加到 16777216.0
。对于double,这里使用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
我需要为使用 C++ new 运算符的特殊应用程序动态分配更大的 float 数组,例如 10G。代码运行 on 64-ubuntu-14.04 Linux OS 64G内存。
当我将内存请求设置为大约 7G 时,1879048192x4/(1024x1024x1024)=7G
(float 有 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的连续内存分配,但是我关闭了所有其他进程,总内存为64G。我想知道我是否可以获得这个更大的阵列,以及如何获得。 Linux 是否限制此动态分配的最大数量?地点和方式?
我试了一下没有发现问题。 new
和 malloc
都有效。我的系统运行 Ubuntu 15.04 并且有 16G 内存。
但是,如果我尝试使用内存,我发现我需要非常小心用于索引数据数组的变量类型。
例如,下面的程序只用 long int
和 float
就可以做一些不需要的事情,因为 long int
的最大值为 2^31
并且数组长度对于 10Gi,将比 2^31
长。此外,浮动每次只将 1.0
添加到 16777216.0
。对于double,这里使用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