LINUX.ORG.RU

вопрос ламер по программированию


0

0

Господа шарящие, расскажите тупому плиз. Я пытаюсь создать матрицу элементов double (статически) размером [x*x][x*x]. Когда x > 31 прога сегфолтается. Я не понимаю почему. Вроде 31 в четвертой степени (примерно миллион) даблов должен занять примерно 8 мб памяти. Не так что бы и много. Или дело не в памяти?

прошу не бить меня. я не программист. приходится программировать в связи с научными интересами моего руководителя.

спасибо

anonymous

твои научные интересы не совпадают с научными интересами руководителя?

какой язык? C/C++? может стоит попробовать жаву?

anonymous
()

и вообще: зачем тебе такая матрица? она у тебя будет вся забита? может она все-таки будет разреженной? готовыми библиотеками пользоваться не хочешь?

anonymous
()
Ответ на: комментарий от anonymous

честно говоря не очень совпадают. коньюктурщик я говенный. но выбирать к сожалению в моем положении не приходится.

пишу на цпп. решил что если уже и браться за изучение программирование, то стоит учить что-то серьезное. может не прав.

но это все рассужения посторонние. что делать-то? матрица нужна. я моделирую решетку из атомов монтекарлой. там что бы сколько то правдоподобные получались числа надо брать размеры образцов порядка сотни ячеек. а я вот максимум 31 могу.

вообще если немного напряч мозг то я могу сделать элегантнее и пользовать только ... половину этой матрицы (даже меньше ибо она симметричная + на диагонали нули). но вопрос все равно остается. почему сегфолт?

спасибо

anonymous
()

Ты эту матрицу, случаем, не на стеке создаешь?

Попробуй динамически выделять память:

double* m = new double[x*x*x*x];

И расчитывать индекс сам: i=x*x*row+column;

watashiwa_daredeska ★★★★
()

Подозреваю, что вы пытаетесь создать эту матрицу в стеке. Покажите код программы, точнее напишите простейшую программу, в которой есть только выделение (вашим методом) и заполнение матрицы. Добейтесь, чтобы это программа сегфолтилась и запостите сюда.

mky ★★★★★
()
Ответ на: комментарий от mky

дайте спрошу. "на стеке" значит память, которая не выделяется динамически? если так то, да - я с память не работаю. то есть массив объявляется как

double massiv[x*x][x*x];

и все.

anonymous
()

сделай массив статическим - добавь static перед описанием массива

или

объяви массив глобально - вынеси описание массива за функцию

anonymous
()
Ответ на: комментарий от anonymous

делаю так

int main () {

double array[32*32][32*32];

... ...

return 0; }

получаю ошибку. вроде такое объявление и есть глобальное.

переписал массив динамически вроде скушал размер 138^4. После того как пару раз прогнал заполнение этого массива нулями комп стал еле работать. Все кряхтит, веник скрежещет (это на своп пишется?) и еще какой то звук странный. никогда видать таких нагрузок не нюхал.

еще вопрос. почему система тормозит после останова программы? я вроде память расчистил delete'ом. есть идеи?

спасибо за ответы.

anonymous
()
Ответ на: комментарий от anonymous

глобальное объявление это так

double array[32*32][32*32];

int main () {

... ...

return 0; }

anonymous
()
Ответ на: комментарий от anonymous

У тебя не хватило физической оперативной памяти, ОС выгрузила все другие приложения в своп, чтобы расчистить больше места.

После останова система тормозит, потому что загружает выгруженные приложения обратно в оперативную память, когда загрузит, тормоза прекратятся.

Решение - улучшить алогоритмы, чтобы они потребляли меньше памяти, либо увеличить объём оперативной памяти (либо мириться с тормозами).

anonymous
()
Ответ на: комментарий от anonymous

> Решение - улучшить алогоритмы, чтобы они потребляли меньше памяти, либо увеличить объём оперативной памяти (либо мириться с тормозами).

Решение - это использовать сторонние библиотеки, в которых все алгоритмы давно уже улучшены.

anonymous
()
Ответ на: комментарий от anonymous

> Решение - это использовать сторонние библиотеки, в которых все алгоритмы давно уже улучшены.

Или использовать что-нибудь типа SAGE www.sagemath.org

smh ★★★
()
Ответ на: комментарий от anonymous

для просто переменных: int *p = new int; delete p;

для массивов: int *p = new int[10]; delete [] p;

Может ты не правильно вызываешь delete?

Devix
()
Ответ на: комментарий от Devix

> Может ты не правильно вызываешь delete?

А если подумать? Какая разница как он вызывает delete и вызывает ли он его вообще, если программа закончила свое выполнение?

// ratger

anonymous
()
Ответ на: комментарий от anonymous

> переписал массив динамически вроде скушал размер 138^4. После того как пару раз прогнал заполнение этого массива нулями комп стал еле работать. Все кряхтит, веник скрежещет (это на своп пишется?) и еще какой то звук странный. никогда видать таких нагрузок не нюхал.

У вас есть 3гб ОЗУ? Нет? Тогда все нормально, так и должно быть.

// moutor

anonymous
()
Ответ на: комментарий от anonymous

> А если подумать?

Можно, подумать если он покажет исходники программы, а в данном случае мог только предположить.

> Какая разница как он вызывает delete и вызывает ли он его вообще, если программа закончила свое выполнение?

Если выделяется память под стандартные типы то скорее всего никакой разници нет, опять таки зависит от реализации компилятора. Если же выделяется память под пользовательские типы то разница есть, сам надеюсь знаещь?

Devix
()
Ответ на: комментарий от anonymous

> После останова система тормозит, потому что загружает выгруженные > приложения обратно в оперативную память, когда загрузит, > тормоза прекратятся.

так и было.

насчет сторонних библиотек. мне не совсем просто понятно. неужто есть какие-то библиотечные функции для ... выделения памяти для массива?

вобщем я сделал так.

double* array = new double[n^4] /* перенумеровал массив и сделал его одномерным */ /* тут вопрос - я при этом выиграю или потеряю в быстродействии? быстродействие критично. для набора нормальной статистики программа гоняется недели */ и нормально. жрет для n=138 максимум. я так понимаю 138^4 ~ 360 10^6 это столько даблов, каждый из которых 8 байт. итого под массив надо 360*8 = 2,8 гб памяти (у меня на машине кстати только 2гига). я все правильно понимаю?

спасибо всем.

anonymous
()
Ответ на: комментарий от anonymous

> быстродействие критично

> итого под массив надо 360*8 = 2,8 гб памяти (у меня на машине кстати только 2гига)

Звездет-с.

> вопрос - я при этом выиграю или потеряю в быстродействии?

Уже без разницы.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от anonymous

> А если подумать? Вот из за таких балбесов как ratger и появляются утечки памяти в программах.

У тебя плохо с логикой. Из того, что написал, никак не следует, что я не слежу за памятью или советую это делать кому-нибудь другому.

// drader

anonymous
()
Ответ на: комментарий от Devix

> Если же выделяется память под пользовательские типы то разница есть, сам надеюсь знаещь?

Честно говоря, не знаю =(

Я погуглю, но лучше на всякий случай напиши ответ.

anonymous
()
Ответ на: комментарий от anonymous

>неужто есть какие-то библиотечные функции для ... выделения памяти для массива?

нет, милый, есть библиотеки для программ научного назначения, в которых за тебя уже позаботились о всех проблемах, которые могут возникнуть, в частности, когда ты собираешься реализовать операции над большими матрицами.

anonymous
()
Ответ на: комментарий от anonymous

> ты бы лучше умное что сказал да объяснил что не правильн

Не правильно тут то, что выделение памяти для всей матрицы тут не является необходимостью, т.к. матрица имеет специальный вид.

// prilve

anonymous
()
Ответ на: комментарий от anonymous

ты имеешь ввиду симметрию матрицы?

откуда new double[x][y]

знает какой вид у матрицы?

насчет научных библиотек товарищ ононизмус пукнул в лужу. давайте программисты будут рассуждать о программировании а не о физике? я же не рассуждаю о программировании. я вопросы задаю.

anonymous
()
Ответ на: комментарий от anonymous

не обижай брата-анонимуса

и лужу не газифицируй, пока тебя совсем на йух не послали тебе еще раз повторить, о великий прогер и физик, что скорей всего твой случай не самый выдающийся и найдутся сторонние, написанные некриворукими ламерами, библиотеки его покрывающие

anonymous
()
Ответ на: комментарий от anonymous

давай без этого а?

про мое величие умолчим, и поставим вопрос так. мне надо массив n^4 элементов. n=130. мне надо заполнить его значениями. давайте скажем мне его нулями надо заполнить. ну вот надо мне. давайте не будем обсуждать откуда у этого алгоритма ноги растут.

внимание вопрос. какие мне для этой задачи использовать библиотеки?

anonymous
()
Ответ на: комментарий от anonymous

Если надо заполнить, а потом просмотреть абсолютно все 130^4 элемента, при 2 гигах оперативки, то дело труба - задачу будете гонять не неделями, а месяцами, а может и годами :). Часть матрицы будет постоянно вытесняться в своп и скорость упадет на несколько порядков. Тут выход либо менять алгоритм на не требующий постоянного присутствия в памяти такого массива, либо просто добавить 1-2 гига памяти.

Если часть элементов массива может быть неопределена, т.е. их значения нас не интересуют, то ищите здесь http://www.oonumerics.org/oon/ и в гугле библиотеки, предоставляюие работу с разряжеными векторами.

Если ваш массив это одномерное представление матрицы и эта матрица симметричная или треугольная, то опять ищите библиотеки, которые предоставляют спецконтейнеры для таких матриц.

Советую взглянуть на MTL по ссылке выше. Я сам с ней не работал, но ее очень хвалили.

Vinick ★★
()
Ответ на: комментарий от anonymous

>мне надо массив n^4 элементов. n=130. мне надо заполнить его значениями. ... внимание вопрос. какие мне для этой задачи использовать библиотеки?

Ты не слушаешь, что тебе говорят, а зря.

Есть библиотеки (я не ткну пальцем, потому что сам не юзал, но знаю, что есть), которые эффективно реализуют математические конструкции и алгоритмы. Вполне возможно, что тебе _не понадобится_ самому реализовывать весь твой алгоритм до самого низкого уровня, не понадобится делать такой массив и пр. То есть библиотека не для того, чтобы как-то суперэффективно выделить эту память, а чтобы воспользоваться готовым решением для симметричных матриц или что необходимо.

>ну вот надо мне. давайте не будем обсуждать откуда у этого алгоритма ноги растут.

В связи с написанным выше, не нужно сужать кругозор и упираться рогом, просто рассмотри, что тебе посоветовали (поискать математические либы).

ftor
()
Ответ на: комментарий от anonymous

Просто поверь нам. В конце концов ты для чего сюда пришел? Случайно не для того, чтобы нас спросить?

// horzed

anonymous
()
Ответ на: комментарий от ftor

ты пойми, я не прочь поучиться. я против того когда мне человек говорит что я дурак. я это и без него знаю. не был бы я в программировании дурак - не пришел бы помощи просить.

что до библиотек, то например у меня генератор случайных чисел заюзан из GSL и нормально. надо было бы мне скажем ньютона котесса какого или там быстрый фурье. я б сам не писал ничего. полез бы в тот же GSL и там взял. или есть еще у нас в колледже IMSL купленный за немалые бабки.

но мне надо то всего массив чисел. я с ним ничего делать не буду. я буду при вычислениях брать из него числа. идея состояла в том что я сгенерю массив нужных мне чисел и буду держать его в оперативке. вместо этого можно считать нужное мне число каждый раз. но это явно не будет работать быстрее чем хранить массив этих чисел и брать их когда надо.

за дальные советы и ссылки спасибо, а горлопанов в реактор.

anonymous
()
Ответ на: комментарий от anonymous

>колледже IMSL купленный за немалые бабки.

птушник детектед

anonymous
()
Ответ на: комментарий от anonymous

>идея состояла в том что я сгенерю массив нужных мне чисел и буду держать его в оперативке. вместо этого можно считать нужное мне число каждый раз. но это явно не будет работать быстрее чем хранить массив этих чисел и брать их когда надо.

Что-то мне подсказывает, что пересчитывая эти числа программа будет работать всё же немного быстрее, чем если в памяти будет массив на 3 гига. Может быть можно как-то изменить алгоритм, чтобы в памяти хранилась только нужная сейчас часть массива, или может изменить функцию вычисления этих чисел для обеспечения максимальной скорости? Как уже было сказано выше, если система уйдёт в своп, то о быстродействии можно забыть.

Laz ★★★★★
()
Ответ на: комментарий от anonymous

А как на счет хранить числа в базе данных, например MySql?

// cheker

anonymous
()
Ответ на: комментарий от anonymous

>Честно говоря, не знаю =( Я погуглю, но лучше на всякий случай напиши ответ.

Попробуй вот этот пример и сравни количество вызовов конструкторов и деструкторов:

#include <iostream>

using namespace std;

class Test { public: Test() { cout << "Constructor" << endl; } ~Test() { cout << "Destructor" << endl; } };

int main() { Test *p1 = new Test[10];

delete [] p1; // замени на: delete p1;

return 0; }

Devix
()
Ответ на: комментарий от anonymous

>Честно говоря, не знаю =(
Я погуглю, но лучше на всякий случай напиши ответ.

Попробуй вот этот пример и сравни количество вызовов конструкторов и деструкторов:

#include <iostream>

using namespace std;

class Test {
public:
Test() { cout << "Constructor" << endl; }
~Test() { cout << "Destructor" << endl; }
};

int main()
{
Test *p1 = new Test[10];

delete [] p1; // замени на: delete p1;

return 0;
}

Devix
()
Ответ на: комментарий от anonymous

> У тебя плохо с логикой. Из того, что написал, никак не следует, что я не слежу за памятью или советую это делать кому-нибудь другому.

Ты думай думай, это не вредно.

anonymous
()
Ответ на: комментарий от Devix

Это все здорово, но вопрос не этом. Вопрос в другом, почему ОС не почистит память после завершения программы?

Мы же говорим об одном и том же, правда? Я говорю про то, что станет с памятью когда программа завершится полностью, ОС о ней уже ничего не знает, ее нет.

// proing

anonymous
()
Ответ на: комментарий от anonymous

> Умри, тролль.

for (int i = 0; i < 2; i++) { for (int k = 0; k < 10; k++) { Медленно вдыхайте через нос до тех пор, пока живот не «раздуется» максимально; Задержите дыхание на несколько секунд; Медленно выдыхайте через рот или нос, пока не выдохните из лёгких весь воздух; } sleep(60*5); }

После загрузки(в свой мозг) и исполнения данной программы(если не перегреешся) ты должен себя почуствовать лучше. А дальше продолжай думать.

PS: Данную программу желательно загружать и выполнять каждый день.

anonymous
()
Ответ на: комментарий от anonymous

> Умри, тролль.

for (int i = 0; i < 2; i++) {
for (int k = 0; k < 10; k++) {
Медленно вдыхайте через нос до тех пор, пока живот не
«раздуется» максимально;
Задержите дыхание на несколько секунд;
Медленно выдыхайте через рот или нос, пока не выдохните из
лёгких весь воздух;
}
sleep(60*5);
}

После загрузки(в свой мозг) и исполнения данной программы(если не перегреешся) ты должен себя почуствовать лучше. А дальше продолжай думать.

PS: Данную программу желательно загружать и выполнять каждый день.


anonymous
()
Ответ на: комментарий от anonymous

> Умри, тролль.

Кстати еще глицин можешь попить. Только его надо пропить целый месяц.

anonymous
()
Ответ на: комментарий от anonymous

>Это все здорово, но вопрос не этом. Вопрос в другом, почему ОС не почистит память после завершения программы?

> Мы же говорим об одном и том же, правда? Я говорю про то, что станет с памятью когда программа завершится полностью, ОС о ней уже ничего не знает, ее нет.

Да разработчикик Мозилы тоже так думают...

Devix
()
Ответ на: комментарий от Devix

Таки почему? Ты можешь это как-нибудь объяснить?

// memkes

anonymous
()
Ответ на: комментарий от Devix

И это, ты хочешь сказать, что даже если закрыть ФФ, то может не вся память вернуться в систему? И теоретически за конечное время можно добиться ситуации, когда в системе не окажется свободной памяти и придется делать ребут?

Если это так, то я был очень наивен. Хотя я, конечно, не исключаю возможности косяков ОС, но блин, никогда такого не замечал. Может это потому, что я не пользуюсь фф...

// doiter

anonymous
()
Ответ на: комментарий от anonymous

> Какая разница как он вызывает delete

На этот я тебе ответил надеюсь ты понял?

> и вызывает ли он его вообще, если программа закончила свое выполнение?

Для данной программы можно и принебречь вызов delete. Но не стоит привыкать к этому, так как в языке C++ есть действия которые выполняются неявно.

Devix
()
Ответ на: комментарий от alex_custov

Сравни:

//test.cpp
#include <iostream>

using namespace std;

class Test {
public:
Test() { cout << "Constructor" << endl; }
~Test() { cout << "Destructor" << endl; }
};

int main()
{
Test *p1 = new Test[10];

delete [] p1;

return 0;
}

c:

//test1.cpp
#include <iostream>

using namespace std;

class Test {
public:
Test() { cout << "Constructor" << endl; }
~Test() { cout << "Destructor" << endl; }
};

int main()
{
Test *p1 = new Test[10];

delete p1;

return 0;
}

Devix
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.