Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java heap space и Граф


Автор: FewG 30.12.2011, 14:48
Добрый День,

есть такая проблема, при создании Графа в виде матрикса (Узлы -> int[], рёбра -> int[][])  с  более 15к узов VM не хватает памяти и выкидывает ошибку: java.lang.OutOfMemoryError: Java heap space. Собственно каким образом можно импплементировать такой граф, какую структуру выбрать?

Автор: Stolzen 30.12.2011, 15:50
В базе данных хранить можно и загружать оттуда в кэш значения кластерами.

Автор: dorogoyIV 30.12.2011, 15:51
что такое 15к ?
можно, конечно, попробовать дать больше ресурсов памяти: java -Xmx1024m [твоя прога]


Цитата(FewG @  30.12.2011,  14:48 Найти цитируемый пост)
какую структуру выбрать?

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

уточни, поясни, ...

Автор: FewG 30.12.2011, 16:14
Цитата
что такое 15к ?

15 000 (пятьнадцать тысяч)

Цитата
в джава нет структур.

А как же 1D, 2D array; heaps и тд. тп? 


P.S. Вроде и так ясно -> имплементирую Граф с 15000-20000 узлами, VM говорит: "мол места нет". Значит мной выбраная "структура"

Код

public class Graph {

    private int[][] edges;
    private int[] vertices;

    public Graph(int V) {
        this.edges = new int[V][V];
        this.vertices = new int[V];
    }
}



не подходит.

Автор: dorogoyIV 30.12.2011, 16:27
Цитата(FewG @  30.12.2011,  16:14 Найти цитируемый пост)
(пятьнадцать тысяч)

блин... smile
вслух, по буквам произнеси!!!
smile ты второй smile
ладно, не обижайся, тут вообще не форум лэнгвистов...



Цитата(FewG @  30.12.2011,  16:14 Найти цитируемый пост)
А как же 1D, 2D array; heaps и тд. тп? 

тут я опять тебя не понимаю...
что имеется ввиду под словом "структура" ?
Код

struct MyElem
{
    int inf;
    struct MyElem * link;
}
* begq = NULL, * endq = NULL;

вот структура на С/C++, а ты про что?

ну а пробовал добавить памяти? - -Xmx

Автор: FewG 30.12.2011, 17:40
Цитата
тут я опять тебя не понимаю...
что имеется ввиду под словом "структура" ?

http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85  smile 

Отводил доп. память, не спасает.  Ведь  всё-таки 15000 в квадрате многовато будет, значит нужно искать другой подход реализации графа.  smile 

Автор: dorogoyIV 30.12.2011, 18:19
да, мы тут помедетируем...
к тому же, возможно телепаты вернуться из отпуска...

(и все равно не понятно - 15к, это 15 Кб что ли?, тогда это 15 * 1024 = 15360 (никак не 15000 !!!)) - ну не могу я тебя понять!!!

Автор: FewG 30.12.2011, 21:17
Цитата(dorogoyIV @ 30.12.2011,  18:19)
да, мы тут помедетируем...
к тому же, возможно телепаты вернуться из отпуска...

(и все равно не понятно - 15к, это 15 Кб что ли?, тогда это 15 * 1024 = 15360 (никак не 15000 !!!)) - ну не могу я тебя понять!!!

15 000 Узлов Графа. На картинке их 6, у меня более 15 000. Ясно?  smile 

user posted image

Автор: dorogoyIV 31.12.2011, 03:07
 smile  во, теперь понятно
ну 15000 это не страшно. может быть ты для каждого узла пишешь - new ... ?
или прога заходит в бесконечную рекурсию или цикл... ?
посмотри внимательно, попробуй оптимизировать код  smile 

Автор: Stolzen 31.12.2011, 05:23
Кстати, 15к и правда не так много, год назад где-то на с++ писал программу, оперирующую на порядок большим количеством узлов - и не вылетала она от потери памяти. Правда данные обрабатывала несколько суток и неправильно smile 

Как сам граф хранится? В виде какой матрицы? Может лучше в виде списков ребер хранить? (И от самого графа ведь зависит! Разреженный он или нет, и прочее)

Автор: dorogoyIV 31.12.2011, 05:43
windows дает в ваше распоряжение 4 Гб памяти. (как в линуксах, я, извините не знаю :( )
этой паматью можно по разному распорядиться...

Автор: Mirkes 1.1.2012, 20:31
Если я правильно понял вопрос, то под "структурой" понимается хранение графа в виде массива вершин и матрици инциденций. 
Как верно заметил Stolzen эффективный способ хранения графа сильно зависит от разреженности. 
Недавно сам писал работу с графами и использовал следующую структуру данных:
1. Масссив вершин 
2. двумерный массив для ребер. При этом для каждой вершины в соответсвующей строке двумерного массива хранился только список вершин, связанных с данной ребром. 
Такая структура данных для графа дает существенную экономию по памяти, если граф не близок к полносвязому (в последнем случае можно хранить список вершин, с которыми данная НЕ связяна ребром).
Правда с такой структурой не удобно работать прирешении некоторых задач на графах.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)