Я использую сервер с памятью 128 ГБ для выполнения некоторых вычислений. Мне нужно malloc()
массив 2D float размером 56120 * 56120. Пример кода выглядит следующим образом:
int main(int argc, char const *argv[])
{
float *ls;
int num = 56120,i,j;
ls = (float *)malloc((num * num)*sizeof(float));
if(ls == NULL){
cout << "malloc failed !!!" << endl;
while(1);
}
cout << "malloc succeeded ~~~" << endl;
return 0;
}
Код успешно компилируется, но когда я его запускаю, он говорит "malloc failed !!!"
. Как я рассчитывал, для хранения всего массива требуется всего 11 ГБ памяти. Прежде чем я начал код, я проверил сервер, и было доступно 110 ГБ свободной памяти. Почему происходит ошибка?
Я также обнаружил, что если я уменьшу num
до, скажем 40000, то malloc преуспеет.
Означает ли это, что существует ограничение на максимальную память, которая может быть выделена malloc()
?
Кроме того, если я изменяю способ выделения, прямо объявляя 2D-массив с плавающей точкой такого размера следующим образом:
int main(int argc, char const *argv[])
{
int num = 56120,i,j;
float ls[3149454400];
if(ls == NULL){
cout << "malloc failed !!!" << endl;
while(1);
}
cout << "malloc succeeded ~~~" << endl;
for(i = num - 10 ; i < num; i ++){
for( j = num - 10; j < num ; j++){
ls[i*num + j] = 1;
}
}
for(i = num - 11 ; i < num; i ++){
for( j = num - 11; j < num ; j++){
cout << ls[i*num + j] << endl;
}
}
return 0;
}
тогда я компилирую и запускаю его. Я получаю "Segmentation fault"
.
Как я могу это решить?