2014-10-19 4 views
0

У меня эти две таблицы в postgresql, PATHWAY и таблица вершин, которую я создал с помощью pgr_createTopology, называемой PATHWAY_VERTICES_PGR. Все было здорово, пока я не решил создать резервную копию базы данных, чтобы восстановить ее позже, теперь, когда я ее восстановил, с теми же версиями postgres 9.3.4 x64, postgis 2.1.3 и pgrouting 2.0, ничего не изменилось, но тот факт, что я восстановил это, и теперь pgr_dijkstra перестал работать, им получать эту ошибку каждый раз, когда я запрашиваю для pgr_dijkstra:pgRouting перестает работать после резервного копирования базы данных

ERRO: Error computing path: Unknown exception caught! 
********** Error ********** 
ERRO: Error computing path: Unknown exception caught! 
SQL state: 38001 

но когда я искать код ошибки:

38001 containing_sql_not_permitted 

пример запроса, который был полностью до момента восстановления:

SELECT seq, id1 AS node, id2 AS edge, cost, geom FROM pgr_dijkstra(' SELECT r.gid as id, r.source, r.target, st_length(r.geom) as cost,r.geom FROM PATHWAY r' ,956358,734134, false, false) as di JOIN PATHWAY pt ON di.id2 = pt.gid 

Я уже пробовал переустанавливать Postgres, удаляя и добавляя расширения postgis и pgrouting, но ошибка сохраняется. Если у вас есть какие-либо идеи, дайте мне знать, эти коды ошибок postgresql трудно расшифровать.

+0

Сообщение: «ERRO: Путь вычисления ошибок: обнаружено исключение!» означает, что что-то в коде C++ взорвалось. Является ли это тем же оборудованием, что и раньше? Более или менее память? был ли изменен файл postgresql.conf? Выполняет ли ANY pgr_dijkstra() запрос? У вас огромные идентификаторы узлов, это может быть проблемой, потому что для этого нужен ОГРОМНЫЙ объем памяти.Вы можете попробовать перенумеровать свои узлы и посмотреть, работает ли это. –

+0

такое же аппаратное обеспечение, как и раньше, то же ОС, 32 ГБ или бара, у меня также была вся резервная копия папки данных на всякий случай, поэтому все файлы conf одинаковы, самые кратчайшие запросы к пути я ставил другие фильтры, чтобы уменьшить использование памяти. Я сделаю новую пару таблиц (edge ​​+ vertices_pgr) с 100k записями, чтобы проверить, является ли это проблемой памяти. Кроме того, тестирование с другими методами кратчайших путей, доступных, bdDijkstra и A * – catacavaco

+0

см http://gis.stackexchange.com/questions/112739/pgrouting-pgr-dijkstra-function-error для подробного технического ответа на это ... – ricquochet

ответ

1

Это проблема распределения памяти.

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

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

Простой тестовый пример, чтобы воспроизвести проблему: Создайте небольшой график с 1 фронтом и начальным и конечным узлами id 2 000 000 000 и 2 000 000 001. Вы получите ошибку, выполняемую dijkstra на этих двух узлах.

Технический анализ следующим образом:

Глядя на исходный код С (PgRouting V2.0.0), в Src \ bd_dijkstra \ Src:

bdsp.c 

... линии 271: вычисление максимального идентификатора узла

for(z=0; z<total_tuples; z++) { 
    if(edges[z].source<v_min_id) v_min_id=edges[z].source; 
    if(edges[z].source>v_max_id) v_max_id=edges[z].source; 
    if(edges[z].target<v_min_id) v_min_id=edges[z].target; 
    if(edges[z].target>v_max_id) v_max_id=edges[z].target; 

затем линия 315, то v_max_id используется в качестве параметра ...

в BiDirDijkstra.cpp ... линия 281, v_max_id + 2 = maxNode

int BiDirDijkstra::bidir_dijkstra(edge_t *edges, unsigned int edge_count, int maxNode, int start_vertex, int end_vertex, 
       path_element_t **path, int *path_count, char **err_msg) 
{ 
    max_node_id = maxNode; 
    max_edge_id = -1; 

    // Allocate memory for local storage like cost and parent holder 
    DBG("calling initall(maxNode=%d)\n", maxNode); 
    initall(maxNode); 

, а затем линия 67, пытаясь выделить много памяти:

void BiDirDijkstra::initall(int maxNode) 
{ 
    int i; 
    m_vecPath.clear(); 
    DBG("BiDirDijkstra::initall: allocating m_pFParent, m_pRParent maxNode: %d\n", maxNode+1); 
    m_pFParent = new PARENT_PATH[maxNode + 1]; 
    m_pRParent = new PARENT_PATH[maxNode + 1]; 
    DBG("BiDirDijkstra::initall: allocated m_pFParent, m_pRParent\n"); 

    DBG("BiDirDijkstra::initall: allocating m_pFCost, m_pRCost maxNode: %d\n", maxNode+1); 
    m_pFCost = new double[maxNode + 1]; 
    m_pRCost = new double[maxNode + 1]; 
... 

Косвенно родственный до http://pgrouting.974090.n3.nabble.com/pgrouting-dev-PGR-2-Add-some-robustness-to-the-boost-wrappers-td4025087.html

+0

Я не знаю, была ли эта конкретная проблема исправлена ​​в pgsql 9.4, но после обновления обоих файлов сервера и базы данных до более новой версии проблемы исчезли, так как сейчас проблема с маслом, без каких-либо проблем с распределением. Спасибо за ваш вклад, это сэкономило мне много времени :) – catacavaco