Господа шарящие, расскажите тупому плиз. Я пытаюсь создать матрицу элементов double (статически) размером [x*x][x*x]. Когда x > 31 прога сегфолтается. Я не понимаю почему. Вроде 31 в четвертой степени (примерно миллион) даблов должен занять примерно 8 мб памяти. Не так что бы и много. Или дело не в памяти?
прошу не бить меня. я не программист. приходится программировать в связи с научными интересами моего руководителя.
честно говоря не очень совпадают. коньюктурщик я говенный. но выбирать к сожалению в моем положении не приходится.
пишу на цпп. решил что если уже и браться за изучение программирование, то стоит учить что-то серьезное. может не прав.
но это все рассужения посторонние. что делать-то? матрица нужна. я моделирую решетку из атомов монтекарлой. там что бы сколько то правдоподобные получались числа надо брать размеры образцов порядка сотни ячеек. а я вот максимум 31 могу.
вообще если немного напряч мозг то я могу сделать элегантнее и пользовать только ... половину этой матрицы (даже меньше ибо она симметричная + на диагонали нули). но вопрос все равно остается. почему сегфолт?
Подозреваю, что вы пытаетесь создать эту матрицу в стеке. Покажите код программы, точнее напишите простейшую программу, в которой есть только выделение (вашим методом) и заполнение матрицы. Добейтесь, чтобы это программа сегфолтилась и запостите сюда.
получаю ошибку. вроде такое объявление и есть глобальное.
переписал массив динамически вроде скушал размер 138^4. После того как пару раз прогнал заполнение этого массива нулями комп стал еле работать. Все кряхтит, веник скрежещет (это на своп пишется?) и еще какой то звук странный. никогда видать таких нагрузок не нюхал.
еще вопрос. почему система тормозит после останова программы? я вроде память расчистил delete'ом. есть идеи?
> переписал массив динамически вроде скушал размер 138^4. После того как пару раз прогнал заполнение этого массива нулями комп стал еле работать. Все кряхтит, веник скрежещет (это на своп пишется?) и еще какой то звук странный. никогда видать таких нагрузок не нюхал.
У вас есть 3гб ОЗУ? Нет? Тогда все нормально, так и должно быть.
Можно, подумать если он покажет исходники программы, а в данном случае мог только предположить.
> Какая разница как он вызывает delete и вызывает ли он его вообще, если программа закончила свое выполнение?
Если выделяется память под стандартные типы то скорее всего никакой разници нет, опять таки зависит от реализации компилятора. Если же выделяется память под пользовательские типы то разница есть, сам надеюсь знаещь?
> После останова система тормозит, потому что загружает выгруженные > приложения обратно в оперативную память, когда загрузит, > тормоза прекратятся.
так и было.
насчет сторонних библиотек. мне не совсем просто понятно. неужто есть какие-то библиотечные функции для ... выделения памяти для массива?
вобщем я сделал так.
double* array = new double[n^4] /* перенумеровал массив и сделал его одномерным */ /* тут вопрос - я при этом выиграю или потеряю в быстродействии? быстродействие критично. для набора нормальной статистики программа гоняется недели */ и нормально. жрет для n=138 максимум. я так понимаю 138^4 ~ 360 10^6 это столько даблов, каждый из которых 8 байт. итого под массив надо 360*8 = 2,8 гб памяти (у меня на машине кстати только 2гига). я все правильно понимаю?
>неужто есть какие-то библиотечные функции для ... выделения памяти для массива?
нет, милый, есть библиотеки для программ научного назначения, в которых за тебя уже позаботились о всех проблемах, которые могут возникнуть, в частности, когда ты собираешься реализовать операции над большими матрицами.
насчет научных библиотек товарищ ононизмус пукнул в лужу. давайте программисты будут рассуждать о программировании а не о физике? я же не рассуждаю о программировании. я вопросы задаю.
и лужу не газифицируй, пока тебя совсем на йух не послали тебе еще раз повторить, о великий прогер и физик, что скорей всего твой случай не самый выдающийся и найдутся сторонние, написанные некриворукими ламерами, библиотеки его покрывающие
про мое величие умолчим, и поставим вопрос так. мне надо массив n^4 элементов. n=130. мне надо заполнить его значениями. давайте скажем мне его нулями надо заполнить. ну вот надо мне. давайте не будем обсуждать откуда у этого алгоритма ноги растут.
внимание вопрос. какие мне для этой задачи использовать библиотеки?
Если надо заполнить, а потом просмотреть абсолютно все 130^4 элемента, при 2 гигах оперативки, то дело труба - задачу будете гонять не неделями, а месяцами, а может и годами :). Часть матрицы будет постоянно вытесняться в своп и скорость упадет на несколько порядков. Тут выход либо менять алгоритм на не требующий постоянного присутствия в памяти такого массива, либо просто добавить 1-2 гига памяти.
Если часть элементов массива может быть неопределена, т.е. их значения нас не интересуют, то ищите здесь http://www.oonumerics.org/oon/ и в гугле библиотеки, предоставляюие работу с разряжеными векторами.
Если ваш массив это одномерное представление матрицы и эта матрица симметричная или треугольная, то опять ищите библиотеки, которые предоставляют спецконтейнеры для таких матриц.
Советую взглянуть на MTL по ссылке выше. Я сам с ней не работал, но ее очень хвалили.
>мне надо массив n^4 элементов. n=130. мне надо заполнить его значениями. ... внимание вопрос. какие мне для этой задачи использовать библиотеки?
Ты не слушаешь, что тебе говорят, а зря.
Есть библиотеки (я не ткну пальцем, потому что сам не юзал, но знаю, что есть), которые эффективно реализуют математические конструкции и алгоритмы. Вполне возможно, что тебе _не понадобится_ самому реализовывать весь твой алгоритм до самого низкого уровня, не понадобится делать такой массив и пр. То есть библиотека не для того, чтобы как-то суперэффективно выделить эту память, а чтобы воспользоваться готовым решением для симметричных матриц или что необходимо.
>ну вот надо мне. давайте не будем обсуждать откуда у этого алгоритма ноги растут.
В связи с написанным выше, не нужно сужать кругозор и упираться рогом, просто рассмотри, что тебе посоветовали (поискать математические либы).
ты пойми, я не прочь поучиться. я против того когда мне человек говорит что я дурак. я это и без него знаю. не был бы я в программировании дурак - не пришел бы помощи просить.
что до библиотек, то например у меня генератор случайных чисел заюзан из GSL и нормально. надо было бы мне скажем ньютона котесса какого или там быстрый фурье. я б сам не писал ничего. полез бы в тот же GSL и там взял. или есть еще у нас в колледже IMSL купленный за немалые бабки.
но мне надо то всего массив чисел. я с ним ничего делать не буду. я буду при вычислениях брать из него числа. идея состояла в том что я сгенерю массив нужных мне чисел и буду держать его в оперативке. вместо этого можно считать нужное мне число каждый раз. но это явно не будет работать быстрее чем хранить массив этих чисел и брать их когда надо.
за дальные советы и ссылки спасибо, а горлопанов в реактор.
>идея состояла в том что я сгенерю массив нужных мне чисел и буду держать его в оперативке. вместо этого можно считать нужное мне число каждый раз. но это явно не будет работать быстрее чем хранить массив этих чисел и брать их когда надо.
Что-то мне подсказывает, что пересчитывая эти числа программа будет работать всё же немного быстрее, чем если в памяти будет массив на 3 гига. Может быть можно как-то изменить алгоритм, чтобы в памяти хранилась только нужная сейчас часть массива, или может изменить функцию вычисления этих чисел для обеспечения максимальной скорости? Как уже было сказано выше, если система уйдёт в своп, то о быстродействии можно забыть.
Это все здорово, но вопрос не этом. Вопрос в другом, почему ОС не почистит память после завершения программы?
Мы же говорим об одном и том же, правда? Я говорю про то, что станет с памятью когда программа завершится полностью, ОС о ней уже ничего не знает, ее нет.
for (int i = 0; i < 2; i++) { for (int k = 0; k < 10; k++) { Медленно вдыхайте через нос до тех пор, пока живот не «раздуется» максимально; Задержите дыхание на несколько секунд; Медленно выдыхайте через рот или нос, пока не выдохните из лёгких весь воздух; } sleep(60*5); }
После загрузки(в свой мозг) и исполнения данной программы(если не перегреешся) ты должен себя почуствовать лучше. А дальше продолжай думать.
PS: Данную программу желательно загружать и выполнять каждый день.
for (int i = 0; i < 2; i++) {
for (int k = 0; k < 10; k++) {
Медленно вдыхайте через нос до тех пор, пока живот не
«раздуется» максимально;
Задержите дыхание на несколько секунд;
Медленно выдыхайте через рот или нос, пока не выдохните из
лёгких весь воздух;
}
sleep(60*5);
}
После загрузки(в свой мозг) и исполнения данной программы(если не перегреешся) ты должен себя почуствовать лучше. А дальше продолжай думать.
PS: Данную программу желательно загружать и выполнять каждый день.
>Это все здорово, но вопрос не этом. Вопрос в другом, почему ОС не почистит память после завершения программы?
> Мы же говорим об одном и том же, правда? Я говорю про то, что станет с памятью когда программа завершится полностью, ОС о ней уже ничего не знает, ее нет.
И это, ты хочешь сказать, что даже если закрыть ФФ, то может не вся память вернуться в систему? И теоретически за конечное время можно добиться ситуации, когда в системе не окажется свободной памяти и придется делать ребут?
Если это так, то я был очень наивен. Хотя я, конечно, не исключаю возможности косяков ОС, но блин, никогда такого не замечал. Может это потому, что я не пользуюсь фф...