![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Alemand |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
Добрый день!
Пишу программу в Delphi, попытался создать двумерный массив 1000x1000 элементов (даже не Real, а Single). Программа компилируется, но при попытке присвоить какое-нибудь значение элементу массива выдаётся сообщение "Stack overflow"... Вроде размер не такой большой - миллион элементов, если тип Single, то каждый - 4 байта, а максимальный размер до 2 Gb, насколько я знаю. Или миллион элементов в массиве - это слишком много? Кроме того, мне дальше придётся работать с трёхмерными массивами 1000x1000x1000, но тут я понимаю вообще шансов на успех нет? |
|||
|
||||
remax |
|
|||
![]() Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Конечно стека не хватит если объявлять массивы такого размера внутри процедуры. Объявляй как глобальный массив и все будет ок. Хотя, возможно, и надо пересмотреть идеологию проги, чтобы не пользовать такие огромные массивы....
-------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
а если создавать объект? он же не в стеке создастся, да?
динамические массива, кстати, в стеке создаются? Добавлено через 1 минуту и 3 секунды и последний вопрос: а что за данные в массиве? не разреженный ли он, этот массив? если разреженный, то хранить лучше по-другому, компактнее. |
|||
|
||||
Alemand |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
remax, спасибо за совет, двумерный случай заработал!
А вот с трёхмерным не знаю что делать - просчитывать по чуть-чуть и всё время записывать информацию в файл, очищая после этого массив? Вот код для трёхмерного случая, который у меня получился:
Добавлено через 4 минуты и 37 секунд skyboy, я пока не знаю, как создавать объекты, к сожалению, только перешёл из MatLab'а в Delphi, потому что кроме Паскаля не знаю других языков, а MatLab на этой моей задаче совсем загулся ![]() Массив не разреженный, к сожалению... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Тогда скорее всего нужно что из Fortran/C++ в 64х битной версии. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
||||
|
||||
remax |
|
|||
![]() Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Немного не патриотично, но! почему бы не сделать ту часть, что работает с большим массивом на MATLAB. Ну, а все остальное можно сделать в Delphi. Понимаете, MATLAB изначально идеологически заточен под работу с матрицами. В принципе, можно и интерфейсную часть на нем сделать, хотя эта область в нем слабовата - и с точки зрения возможностей и с точки зрения разработки. Т.е., я бы в такой ситуации или переработал бы алгоритм, с целью уменьшения размера массива или сделал бы прогу на Delphi, из которой вызывался бы скрипт на MATLAB.
-------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
а ещё можно в памяти обрабатывать небольшой кусок данных. а остальное держать в файле/файлах. страшно, зато просто.
|
|||
|
||||
remax |
|
|||
![]() Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Да, я тоже про файлы думал, но, наверное, очень замедлится расчет...
Скорее надо обратиться не к файлу, а к СУБД. ![]() ![]() Это сообщение отредактировал(а) remax - 2.12.2010, 17:48 -------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
Alemand |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
remax, я изначально делал программу в MatLab, но как раз из-за этих больших массивов и подался в Delphi, потому что подумал, что здесь больше возможностей по работе с теми же файлами и вообще считает быстрее.
|
|||
|
||||
remax |
|
|||
![]() Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Не хотелось огорчать, но вряд ли это было правильное решение. Повторюсь еще раз, что Matlab специализируется на работах с матрицами и в этой области за много лет уже так вылизан, что, теоретически, можно, наверное, попытаться это сделать лучше, но шансов практически нет... Matlab начинает работать медленно с большими массивами в 2х случаях: 1) Если не стоят в нужных местах ";" и поэтому не подавляется вывод на экран результатов по изменению каждой ячейки массива. Скорость при этом падает на 1-2 порядка и сопоставима с тормознутым MatCad. Исправляется легко и быстро. 2) Если размер данных вынуждает его интенсивно использовать сваппинг (работать с файлом подкачки) - без комментариев, вряд ли какая система в этой ситуации сможет работать быстрее. В принципе, уже есть возможность сравнить скорость работы Matlab и Delphi в равных условиях. Я, так понимаю, что с двумерным массивом (1000*1000) Ваша программа уже работает? Сравните для этого случая. Если окажется, что Matlab медленнее (в чем я лично сомневаюсь), то тогда сделаем на Delphi. Вариантов реализации много.... П.С. А если быстрее Matlab, то версию (1000*1000*1000) сделаем тоже на нем... ![]() Это сообщение отредактировал(а) remax - 3.12.2010, 01:23 -------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
remax |
|
|||
![]() Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Вот, возможно, решение ваших проблем - Вычислительная система Matrix32 for Delphi
-------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |