0

postgresql 、 PATHWAY 、および pgr_createTopology を使用して作成した PATHWAY_VERTICES_PGR という頂点テーブルにこれら 2 つのテーブルがあります。データベースをバックアップして後で復元することを決定するまで、すべてが素晴らしかったです。同じ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 に基づいてメモリを割り当てようとします。

ダイクストラ、ドライビングディスタンス、その他の関数にも同じ問題があります。IMHOこれは本当の問題です。エッジとノードの番号を付け直さないと巨大なグラフからサブグラフを選択できず、これらの関数のクエリパラメーターが使用できなくなるためです。

問題を再現するための簡単なテスト ケース: 1 つのエッジと開始ノード ID と終了ノード ID が 2 000 000 000 と 2 000 000 001 の小さなグラフを作成します。これら 2 つのノードで 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 に答える