これはメモリ割り当ての問題です。
ソース ノードとターゲット ノードの 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に間接的に関連