| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Слишком большой массив? |
| Автор: Alemand 30.11.2010, 01:39 |
| Добрый день! Пишу программу в Delphi, попытался создать двумерный массив 1000x1000 элементов (даже не Real, а Single). Программа компилируется, но при попытке присвоить какое-нибудь значение элементу массива выдаётся сообщение "Stack overflow"... Вроде размер не такой большой - миллион элементов, если тип Single, то каждый - 4 байта, а максимальный размер до 2 Gb, насколько я знаю. Или миллион элементов в массиве - это слишком много? Кроме того, мне дальше придётся работать с трёхмерными массивами 1000x1000x1000, но тут я понимаю вообще шансов на успех нет? |
| Автор: remax 30.11.2010, 02:42 |
| Конечно стека не хватит если объявлять массивы такого размера внутри процедуры. Объявляй как глобальный массив и все будет ок. Хотя, возможно, и надо пересмотреть идеологию проги, чтобы не пользовать такие огромные массивы.... |
| Автор: skyboy 30.11.2010, 15:17 |
| а если создавать объект? он же не в стеке создастся, да? динамические массива, кстати, в стеке создаются? Добавлено через 1 минуту и 3 секунды и последний вопрос: а что за данные в массиве? не http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2 ли он, этот массив? если разреженный, то хранить лучше по-другому, компактнее. |
| Автор: Alemand 1.12.2010, 21:59 | ||
| remax, спасибо за совет, двумерный случай заработал! А вот с трёхмерным не знаю что делать - просчитывать по чуть-чуть и всё время записывать информацию в файл, очищая после этого массив? Вот код для трёхмерного случая, который у меня получился:
Добавлено через 4 минуты и 37 секунд skyboy, я пока не знаю, как создавать объекты, к сожалению, только перешёл из MatLab'а в Delphi, потому что кроме Паскаля не знаю других языков, а MatLab на этой моей задаче совсем загулся Массив не разреженный, к сожалению... |
| Автор: skyboy 2.12.2010, 00:03 | ||
вот это я пропустил. да, проблемка. простое решение - перейти к х64: чтоб и программа, и ОС поддерживала адресацию намного большую 2 миллиардов. |
| Автор: remax 2.12.2010, 17:12 |
| Немного не патриотично, но! почему бы не сделать ту часть, что работает с большим массивом на MATLAB. Ну, а все остальное можно сделать в Delphi. Понимаете, MATLAB изначально идеологически заточен под работу с матрицами. В принципе, можно и интерфейсную часть на нем сделать, хотя эта область в нем слабовата - и с точки зрения возможностей и с точки зрения разработки. Т.е., я бы в такой ситуации или переработал бы алгоритм, с целью уменьшения размера массива или сделал бы прогу на Delphi, из которой вызывался бы скрипт на MATLAB. |
| Автор: skyboy 2.12.2010, 17:34 |
| а ещё можно в памяти обрабатывать небольшой кусок данных. а остальное держать в файле/файлах. страшно, зато просто. |
| Автор: remax 2.12.2010, 17:43 |
| Да, я тоже про файлы думал, но, наверное, очень замедлится расчет... Скорее надо обратиться не к файлу, а к СУБД. |
| Автор: Alemand 2.12.2010, 21:53 |
| remax, я изначально делал программу в MatLab, но как раз из-за этих больших массивов и подался в Delphi, потому что подумал, что здесь больше возможностей по работе с теми же файлами и вообще считает быстрее. |
| Автор: remax 3.12.2010, 01:06 | ||
Не хотелось огорчать, но вряд ли это было правильное решение. Повторюсь еще раз, что Matlab специализируется на работах с матрицами и в этой области за много лет уже так вылизан, что, теоретически, можно, наверное, попытаться это сделать лучше, но шансов практически нет... Matlab начинает работать медленно с большими массивами в 2х случаях: 1) Если не стоят в нужных местах ";" и поэтому не подавляется вывод на экран результатов по изменению каждой ячейки массива. Скорость при этом падает на 1-2 порядка и сопоставима с тормознутым MatCad. Исправляется легко и быстро. 2) Если размер данных вынуждает его интенсивно использовать сваппинг (работать с файлом подкачки) - без комментариев, вряд ли какая система в этой ситуации сможет работать быстрее. В принципе, уже есть возможность сравнить скорость работы Matlab и Delphi в равных условиях. Я, так понимаю, что с двумерным массивом (1000*1000) Ваша программа уже работает? Сравните для этого случая. Если окажется, что Matlab медленнее (в чем я лично сомневаюсь), то тогда сделаем на Delphi. Вариантов реализации много.... П.С. А если быстрее Matlab, то версию (1000*1000*1000) сделаем тоже на нем... |
| Автор: remax 4.12.2010, 23:32 |
| Вот, возможно, решение ваших проблем - http://matrix.kladovka.net.ru/?page=about |