0

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

4

1 回答 1

1

这是一个内存分配问题。

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

Dijkstra、drivingDistance 等函数也有同样的问题。恕我直言,这是一个真正的问题,因为您无法在不重新编号边和节点的情况下从巨大的图中选择子图,这会导致这些函数的查询参数不可用。

重现问题的简单测试用例:创建一个小图,其中包含 1 条边,起始和结束节点 id 分别为 2 000 000 000 和 2 000 000 001。在这两个节点上运行 dijkstra 会出错。

技术分析如下:

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

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间接相关

于 2015-01-27T17:32:16.620 回答