Текущий архив: 2005.08.14;
Скачать: CL | DM;
Вниз
Массив из 5 и выше млн. элементов типа single-переполнение стека Найти похожие ветки
← →
alexander_ua (2005-07-21 18:11) [0]В процедуре объявляю массив типа single, размерность - 5 млн. элементов. Программа компилируется, запускается. При попытке работать с массивом дает ошибку "Переполнение стека". Размер стека сделал максимально возможным, но это ничего не дало. Как лечить?
← →
Stakan © (2005-07-21 18:16) [1]Вносить справления в код работы с массивом.
← →
Юрий Зотов © (2005-07-21 18:16) [2]Сделать массив динамическим.
← →
alexander_ua (2005-07-21 18:17) [3]В смысле исправление? Переполнение стека возникает как только я начинаю обращаться к массиву, ну т.е. как только дело доходит к примеру до a[1]:=1; - переполнение стека.
← →
alexander_ua (2005-07-21 18:18) [4]2 Юрий Зотов
И ограничений на размер уже не будет?
← →
vrem (2005-07-21 18:18) [5]объявлять глобально, а не в функции
← →
Fay © (2005-07-21 18:19) [6]2 alexander_ua (21.07.05 18:11)
type
PYourArray = ^TYourAray;
TYourArray = packed array[0..0] of Single;
var
p : PYourArray;
i : Integer;
begin
GetMem(p, SizeOf(Single) * 5000000);
for i := 0 to 4999999 do
p^[i] := 1.234;
FreeMem(p);
end;
← →
alexander_ua (2005-07-21 18:20) [7]А что более предпочтительно? Глобальное обьявление или динамический массив?
← →
Юрий Зотов © (2005-07-21 18:22) [8]> alexander_ua (21.07.05 18:18) [4]
> И ограничений на размер уже не будет?
Переменная типа "динамический массив" - это, по сути, указатель. Он и будет храниться в стеке - то есть, всего 4 байта. Сам же массив после SetLength будет размещен уже не в стеке, а в динамической памяти. Ограничения на него, конечно, все равно есть, но они уже совсем другие - 2 гигабайта на всю программу.
← →
Fay © (2005-07-21 18:22) [9]2 alexander_ua (21.07.05 18:20) [7]
Объявлять нужно там, где используется.
← →
alexander_ua (2005-07-21 18:23) [10]ОК, спасибо за советы, будем пробовать.
Ох, люблю я этот форум, всегда умные люди быстро и качественно ответят и подскажут.
Спасибо!
← →
Юрий Зотов © (2005-07-21 18:28) [11]> alexander_ua (21.07.05 18:20) [7]
А что более предпочтительно? Глобальное обьявление или динамический массив?
Если важнее скорость, то предпочтительнее глобальный статический массив (тогда не будет тратиться время на операции по выделению и освобождению памяти). Если же важнее память, то предпочтительнее локальный динамический массив (он будет существовать только во время выполнения процедуры, где он объявлен).
← →
Гаврила © (2005-07-21 19:16) [12]Что за жуткий размер массива?
"С запасом" чтоли сразу выделаешь?
← →
alexander_ua (2005-07-22 11:33) [13]2 Гаврила
Массив совсем не жуткий - матрица 3000*3000 для решения системы линейных алгебраических уравнений.
← →
evvcom © (2005-07-22 11:42) [14]Значит жуткая система. Для решения одного единственного уравнения? Одной единственной размерности? Или все же универсальная какая-то программа для решения таких уравнений различных размерностей?
← →
alexander_ua (2005-07-22 11:55) [15]2 evvcom
Это почему же жуткая??? 3000 тысячи неизвестных, соответственно и размерность получается 3000*3000
← →
evvcom © (2005-07-22 11:59) [16]
> Это почему же жуткая???
Флейм развел, а на вопросы по теме так и не ответил. Или ответы уже не нужны?
← →
Anatoly Podgoretsky © (2005-07-22 12:02) [17]alexander_ua (22.07.05 11:55) [15]
Всего 72 мегабайта
← →
TUser © (2005-07-22 12:42) [18]Еще одно решение в догонку - локальный статический массив, + диррективы $M/$MAXSTACKSIZE.
← →
alexander_ua (2005-07-22 12:48) [19]2 evvcom
Так, поясните тогда пожалуйста что Вы имеете ввиду под фразой "Для решения одного единственного уравнения?". Как я уже сказал, решается СИСТЕМА уравнений.
"Одной единственной размерности?" - что имеется ввиду?
← →
Digitman © (2005-07-22 12:48) [20]
> В процедуре объявляю массив типа single, размерность - 5
> млн. элементов
больше так не делай.
← →
Anatoly Podgoretsky © (2005-07-22 13:19) [21]TUser © (22.07.05 12:42) [18]
В 80 мегабайт?
← →
Джо © (2005-07-22 13:26) [22]Читаешь про такие массивы и диву даешься - насколько Виндовс людей избаловал, да...
← →
alexander_ua (2005-07-22 13:26) [23]2 Anatoly Podgoretsky
Интересно, почему у Вас такой размер большой получается. Если взять массив 3000*3000 типа single (4 byte), то получаем объем памяти 3000*3000*4/(1024*1024)=34 мегабайта. Или я неправильно считаю?
← →
alexander_ua (2005-07-22 13:27) [24]2 Джо
Ну не знаю, как насчет избаловал... Я бы сказал не так, а к примеру "дал возможность считать то (или с такой точностью), о какой раньше можно было только мечать..."
← →
Anatoly Podgoretsky © (2005-07-22 13:31) [25]alexander_ua (22.07.05 13:26) [23]
3000*3000*SizeOf(Single) Я ошибся посчитал для Double
Все равно для такого размера стек потребуется мегабайт 40 и то если нет рекурсии.
← →
Digitman © (2005-07-22 13:34) [26]
> Или я неправильно считаю?
да по колено как ты считаешь)
хоть 5 хоть 34 мбайта - такие объемы слишком серьезны для дел, касаемых стека ... впору призадуматься о переделке алгоритма в части переноса таких аллокаций из стека в кучу
← →
_Lucky_ (2005-07-22 13:51) [27]А чего за уравнения-то? примерчик приведи.
← →
alexander_ua (2005-07-22 14:01) [28]2 _Lucky_
Система линейных алгебраический уравнений
a11*x1+a12*x2+...+a1n*xn=b1
...............
an1*x1+an2*x2+...+ann*xn=bn
← →
evvcom © (2005-07-22 16:59) [29]
> что Вы имеете ввиду под фразой "Для решения одного единственного уравнения?".
я не по-русски написал?
> "Одной единственной размерности?" - что имеется ввиду?
Только 3000 неизвестных? Или будут другие уравнения, 2000, 2500 неизвестных?
← →
alexander_ua (2005-07-22 17:06) [30]2 evvcom
я не по-русски написал?
я тоже по русски написал - не одного уравнения, а системы.
Только 3000 неизвестных? Или будут другие уравнения, 2000, 2500 неизвестных?
Количество неизвестных определяется исходя из задаваемых пользователем параметров, т.е. к примеру при одних заданных условиях количество=3000, при других условиях - 2500.
Если я правильно понял вопрос, конечно.
← →
evvcom © (2005-07-22 17:10) [31]
> я тоже по русски написал - не одного уравнения, а системы.
ну да, систему и я имел ввиду.
> Если я правильно понял вопрос, конечно
Правильно. Тогда динамический массив, однозначно. Имхо.
← →
alexander_ua (2005-07-22 17:13) [32]2 evvcom
Ок, спасибо. Попробовал - работает. Теперь уже возникают проблемы другого плана - скорость решения этой самой СЛАУ. Так, к примеру матрица 3200*3200 на intel pentium IV 2.8 Гц решается 25 минут, что же будет на моем домашнем celeron 850... Но это как говорится уже другая песня...
← →
Digitman © (2005-07-22 17:18) [33]
> alexander_ua (22.07.05 17:13) [32]
на то интел придумал хренову тучу технологий/механизмов : MMX, SSE и иже с ними
← →
Юрий Зотов © (2005-07-22 17:27) [34]> alexander_ua (22.07.05 17:13) [32]
> матрица 3200*3200 на intel pentium IV 2.8 Гц решается 25
> минут
Это еще немного. Численное решение многих задач матмоделирования тоже сводится к решению СЛАУ и счет может длиться неделями.
Оптимизируйте алгоритм и сами вычисления, больше тут ничего не придумаешь.
← →
evvcom © (2005-07-22 17:41) [35]
> 2 evvcom
> Ок, спасибо. Попробовал - работает.
Странные люди. Лавры достаются последнему? Еще Юрий Зотов © (21.07.05 18:16) [2] об этом говорил. Пост [32] должен был быть после [2]
← →
Fay © (2005-07-22 19:03) [36]2 evvcom © (22.07.05 17:41) [35]
Уверен, Юрий Зотов как-нибудь перезимует без этих лавров 8)
← →
alexander_ua (2005-07-25 12:43) [37]Уважаемые коллеги! Спасибо говорю ВСЕМ, Вы ничего такого не подумайте! Действительно, всем огромное спасибо, так быстро и качественно решили мою проблему!
Страницы: 1 вся ветка
Текущий архив: 2005.08.14;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.011 c