这是一个内存分配问题。
您的源节点和目标节点具有高 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间接相关