pgRouting在数据库备份后停止工作

时间:2014-10-19 07:46:29

标签: sql postgresql postgis pgrouting

我在postgresql,PATHWAY和我使用pgr_createTopology创建的顶点表中有这两个表,称为PATHWAY_VERTICES_PGR。一切都很好,直到我决定备份数据库以便以后恢复它,现在我已经恢复它,使用相同的postgres 9.3.4 x64,postgis 2.1.3和pgrouting 2.0版本,没有任何改变,但事实上我已经恢复它,现在pgr_dijkstra停止工作,我每次查询pgr_dijkstra时都会收到此错误:

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错误代码很难破译

1 个答案:

答案 0 :(得分:1)

这是内存分配问题。

您的源节点和目标节点具有较高的ID,并且PgRouting尝试根据它可以找到的最高节点ID来分配内存,即使图中只有少量边和节点。

Dijkstra,驾驶距离和其他功能都有同样的问题。 恕我直言,这是一个真正的问题,因为你不能从一个巨大的图形中选择一个子图而不重新编号边和节点,这使得这些函数的查询参数无法使用。

重现问题的简单测试用例:创建一个带有1个边的小图,以及2 000 000 000和2 000 000 001的起始和结束节点ID。在这两个节点上运行dijkstra会出错。

技术分析如下:

查看C源代码(PgRouting v2.0.0),在src \ bd_dijkstra \ src中:

bdsp.c 

... 第271行:计算最大节点ID

  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用作参数...

  ret = bidirsp_wrapper(edges, total_271tuples, v_max_id + 2, start_vertex, end_vertex,
                       directed, has_reverse_cost,
                       path, path_count, &err_msg);

在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

间接相关