|
|
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
Есть граф (10^8 вершин), нужно хранить его в БД, так чтобы можно было достаточно эффективно по нему выполнять его обход, например поиск в ширину с ограничением по глубине. Плюс ежедневно нужно его актуализировать, примерно 10^7 вершин меняют свои атрибуты. Возможно есть какие то типовые варианты решения подобных задач? Есть ли эффективные решения на базе реляционных СУБД? Почему то кажется, что стандартный подход для графа, хранить в виде двух таблиц вершины+ребра будет слишком медленно. Пока видится какой нибудь NoSQL вариант и каждая вершина хранит ссылки на соседние. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2011, 17:59 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimirВозможно есть какие то типовые варианты решения подобных задач? Есть ли эффективные решения на базе реляционных СУБД? Oracle + таблица рёбер + connect by = решение. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2011, 19:25 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimir Возможно есть какие то типовые варианты решения подобных задач? http://www.osp.ru/pcworld/2007/03/4199032/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2011, 19:33 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovjust_vladimirВозможно есть какие то типовые варианты решения подобных задач? Есть ли эффективные решения на базе реляционных СУБД? Oracle + таблица рёбер + connect by = решение. А как изнутри это работает? Все равно ведь будут join'ы? Надо по экспериментировать, но что то сомневаюсь в производительности ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2011, 22:44 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimirА как изнутри это работает? А тебе не пох если ты получаешь нужный результат в приемлемые сроки?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2011, 23:12 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
JOINы JOINам рознь грят, если JOIN по ключам и/или по индексированным полям, то сильно быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 01:53 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
U-geneJOINы JOINам рознь грят, если JOIN по ключам и/или по индексированным полям, то сильно быстрее А чо, кто-то по другому делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 05:41 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovjust_vladimirВозможно есть какие то типовые варианты решения подобных задач? Есть ли эффективные решения на базе реляционных СУБД? Oracle + таблица рёбер + connect by = решение. Ну все же connect by не для обхода графов вообще, а скорее только для деревьев и лесов. И для обхода, скорей всего, в глубину а не в ширину. Потому возможно в сложных случаях нужно, возможно, приложить дополнтиельные усилия. В частности в Оракле с 11 версиии, а Скуля и раньше есть рекурсивные запросы. Ну есть у Оракла там всякие дополнительные МД (правда не знаю точно подходят ли какие для графов вообще) ну и ОРМД. Но все же реляционные БД и даже объектнорекляционные ориентированы на графы в меньшей степени. Если у Вас, например, связано с поиском каких-то решенний типа игры в шахматы, то, возможно, эффективность на базе реляционных нуждается в более тщательных оценках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 08:42 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
vadiminfoНу все же connect by не для обхода графов вообще, а скорее только для деревьев и лесов. И для обхода, скорей всего, в глубину а не в ширину. Ну так ТС-у и надо в глубину с ограничением. А для графов в ней есть кляуза no cycle. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 13:21 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
Нет, надо именно в ширину, а по глубине ограничивать только интересующую область поиска, чтобы не перебирать весь граф. Граф с циклами. ЗЫ: попробовал выполнить самый обычный join на таблице подобного размера, результатов работы не дождался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 13:57 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimir.... ЗЫ: попробовал выполнить самый обычный join на таблице подобного размера, результатов работы не дождался... А полный скриптик JOIN'еных таблиц (таблицы) со всеми причиндалами можно глянуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 14:29 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimir Плюс ежедневно нужно его актуализировать, примерно 10^7 вершин меняют свои атрибуты. То есть таблица статична, и только раз в день создается новая, а затем переименовывается. just_vladimir ЗЫ: попробовал выполнить самый обычный join на таблице подобного размера, результатов работы не дождался... Вы просто не умеете их готовить. Или попросили слишком много. Давайте забудем на секунду, что это граф. У вас есть задача - быстро выполнять определенный тип запросов, и при этом не умирать на остальных запросах и обновлениях. Классическое решение - денормализация, то есть храните то, что потом будет удобно запрашивать. connect by (или recursive CTE) это тот же самый left join только с неопределенной глубиной. И имеет те же самые недостатки - обход строка за строкой, блок за блоком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 19:00 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
SERG1257те же самые недостатки - обход строка за строкой, блок за блоком. Но если учесть, что обходить придётся только соседей заданной вершины, то это будет не так уж и много. Вряд ли у ТСа граф полносвязный. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 19:07 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
SERG1257Давайте забудем на секунду, что это граф. У вас есть задача - быстро выполнять определенный тип запросов, и при этом не умирать на остальных запросах и обновлениях. Классическое решение - денормализация, то есть храните то, что потом будет удобно запрашивать. Да, нужно именно это, определенный тип запросов к статичной таблице, актуализация происходит в отдельное время от этих запросов, во время актуализации можно выполнять пред подготовку данных. Мне эта пред подготовка видится в хранении сразу вместе с вершиной ребер относящихся к этой вершине, но их количество ведь не постоянно. На сколько накладно хранить их в чем то CLOB'о подобном? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 21:45 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimirМне эта пред подготовка видится в хранении сразу вместе с вершиной ребер относящихся к этой вершине, но их количество ведь не постоянно. Какие критерии требуют такого? Чем классика не подходит? Попробуйте обосновать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 22:17 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimir На сколько накладно хранить их в чем то CLOB'о подобном? Хранить совершенно не накладно (диски и память сейчас дешевы), а вот насколько накладно обрабатывать это надо посмотреть. Вы статью-то читали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 23:31 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
On 11/13/2011 06:59 PM, just_vladimir wrote: > Есть граф (10^8 вершин), нужно хранить его в БД, так чтобы можно было достаточно > эффективно по нему выполнять его обход, например поиск в ширину с ограничением > по глубине. Плюс ежедневно нужно его актуализировать, примерно 10^7 вершин Это получается 100 миллионов вершин ? А что за задача ? У нас БОЛЬШЕ графы хранятся, по несколько десятков миллиардов вершин, и ничего. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2011, 01:22 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
SERG1257 Хранить совершенно не накладно (диски и память сейчас дешевы), а вот насколько накладно обрабатывать это надо посмотреть. Вы статью-то читали? Статью читал. С замечанием согласен, впредь буду более точен в формулировках, нужно именно уметь обрабатывать. RXLКакие критерии требуют такого? Чем классика не подходит? Попробуйте обосновать. Вы о чём вообще? Критерий - производительность. Если при работе с графом всегда нужна информация о соседях вершины, то зачем для этого каждый раз выполнять запрос, когда можно хранить эти данные вместе с самой вершиной? Согласен, что будет дублирование информации, но как тут заметили стоимость дискового пространства в наше время не так уж и высока. MasterZivЭто получается 100 миллионов вершин ? А что за задача ? У нас БОЛЬШЕ графы хранятся, по несколько десятков миллиардов вершин, и ничего. Да, 100 млн вершин. Подумал на тему, какие могут быть графы и их размеры, вот что получилось: 10^3 - Количество городов в России 10^6 - Количество записей в ЕГРЮЛ 10^8 - Население РФ, Количество пользователей vk.ru 10^9 - Количество пользователей fb, Количество платежей совершаемых в России за год 10^11 - Количество нейронов в мозгу человека. Что-то Ваша цифра в 10^10 кажется весьма высокой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2011, 13:21 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimirзачем для этого каждый раз выполнять запрос, когда можно хранить эти данные вместе с самой вершиной? Затем, что результаты запроса можно обработать в ХП, а парсить клоб - недешёвое удовольствие. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2011, 13:52 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЗатем, что результаты запроса можно обработать в ХП, а парсить клоб - недешёвое удовольствие. По этому сейчас я экспериментирую с MongoDB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2011, 13:58 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
just_vladimir Критерий - производительность. Если при работе с графом всегда нужна информация о соседях вершины, то зачем для этого каждый раз выполнять запрос, когда можно хранить эти данные вместе с самой вершиной?Давайте опять подальше от вершин ребер и графов и поближе к СУБД. У вас есть запрос (запросы) от прикладной програмы так давайте его и отлаживать. Клоб (в виде csv) неудобно обрабатывать в SQL, у вас есть соблазн обработать его в прикладной программе навигационно - строчка за строчкой, блок за блоком. Даже если каждая строка обрабатывается быстро (пусть супербыстро в NoSQL), производительность общего запроса не очень, за счет накладных расходов. Я предлагаю вам подумать над идеальным конечным результатом - запрос от базы -> ответ в виде датасета. Например хранение материализованных путей (типа файлов в файловой системе) это тоже клоб, но обрабатывается (читается) он один раз и если повезет то по индексу Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2011, 18:48 |
|
||
|
Хранение большого графа
|
|||
|---|---|---|---|
|
#18+
On 11/19/2011 02:21 PM, just_vladimir wrote: > 10^9 - Количество пользователей fb, Количество платежей совершаемых в России за год > 10^11 - Количество нейронов в мозгу человека. > > Что-то Ваша цифра в 10^10 кажется весьма высокой... Потому что там несколько таких "количеств" хранится в одном виде и в одном месте. http://linkeddata.org/ Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2011, 01:49 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37525352&tid=1541939]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 446ms |

| 0 / 0 |
