Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.55 MB
Время: 0.029 c
14-1121798060
Керк
2005-07-19 22:34
2005.08.14
Вся правда о Гагарине


9-1113736502
Yegorchic
2005-04-17 15:15
2005.08.14
Поворот камеры


14-1121749700
NeyroSpace
2005-07-19 09:08
2005.08.14
А если нефть и газ будут никому не нужны?


3-1120461903
kyn66
2005-07-04 11:25
2005.08.14
Как обратиться к столбцу суммы EhLib ?


1-1122008024
serega78
2005-07-22 08:53
2005.08.14
Как отловить событие Close [x] на форме?