Выделение памяти для динамического массива.

Olimpic

Пишу на С. Мне нужно использовать трехмерный динамический массив n*n*n. Для небольших n
все работает нормально, а для n>=1000 программа вылетает. От чего зависит, какой объем памяти можно выделить под динамический массив?

kokoc88

Тебя сейчас спросят о том, на какой ты платформе...

a100251

На какой платформе?

Sharp

ты выделяешь всю память одним блоком, типа
 arr = (double*)malloc(sizeof(double)*n*n*n); 
?
Т.е. при n=1024, ты хочешь 8 Гб одним куском?
Подумай об алгоритме, менее требовательным к памяти.
Если не получается, то выделяй так:
 
arr = (double**)malloc(sizeof(double*)*n);
for(int i=0; i<n; i++) {
arr[i] = (double*)malloc(sizeof(double)*n*n);
}

Ну и не забудь все malloc проверять, возвращаю они тебе NULL или нормальный указатель.

Olimpic

Вот,как это делалось:
 arr=(int ***)calloc(n,sizeof(int **;
for (i=0; i<n; i++)
{arr[i]=(int **)calloc(n,sizeof(int *;
for (j=0; j<n; j++)
{arr[i][j]=(int *)calloc(n,sizeof(int;}
}

margadon

а какая платформа? 8 гигов куском?! уже после 2х гигов будут проблемы.
хотя может такое и можно...
проц 64 разрядный?
я бы на месте операционки на такое обиделся.

maggi14

а сколько у тебя памяти-то? и еще, насколько я помню, больше 4 гб все равно выделить нельзя

Julie16

Ответ: на динамический массив можно выделить не больше чем min(у тебя есть адресного пространства, свободной оперативной памяти + свободного swap). Можно конечно еще mmap делать(если памяти мало, но есть свободное адресное пространство но это для извращенцев
Ps: на какой ты платформе?

maggi14

да, пардон, а платформа-то какая?

Julie16

Да, я так же как-то(лет 10 назад ) на паскале под досом несколько гигов выделил...

maggi14

а я не сумел. Потому что там было ограничение на 64k. По крайней мере, десять лет назад

Julie16

Эээээ... Так я так же, кусочками

Helga87

Нет. Если выделять динамическую память, то можно было около 300-400 Кб (кусочками, как правильно заметил ПэЖэ) . А если использовать модуль для работы с памятью от Фаронова, то сколько есть на компьютере.

maggi14

эх, на Фаронова у меня деньги появились только лет 7 назад, когда я уже плавно с паскаля слезал

Sharp

 arr=(int ***)calloc(n,sizeof(int **;
for (i=0; i<n; i++)
{arr[i]=(int **)calloc(n,sizeof(int *;
for (j=0; j<n; j++) ...

начиная с некоторого i, у тебя a[i] = NULL. А строчкой ниже
  {arr[i][j]=(int *)calloc(n,sizeof(int;}
}

ты пишешь в a[i][j].
Еще раз советую, поменяй алгоритм. Может у тебя матрица сильно разрежена, на это есть отдельные алгоритмы на работу с ними, а может можно вовсе без нее обойтись.
Количество же память, выделяемой процессу - настройка OC. Во FreeBSD на это есть отдельная переменная sysctl-я. В Линуксе должно быть что-то подобное. Под Виндой - без понятия.

Olenenok

Могу дать свой контейнер - у него довольно высокая скорость работы и память выделяется кусочками
Оставить комментарий
Имя или ник:
Комментарий: