Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

Массив из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.012 c
1-1122461038
chili
2005-07-27 14:43
2005.08.14
Подскажите почему не работает ExtractIcon


3-1120523457
LF
2005-07-05 04:30
2005.08.14
Игнорируется EOleException


14-1121954003
MegaVolt
2005-07-21 17:53
2005.08.14
Господа что за чудо D5.5? Где взять можно?


14-1122279431
aliced
2005-07-25 12:17
2005.08.14
class TButton not found


1-1122014723
Valera
2005-07-22 10:45
2005.08.14
Замена в Run-Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский