Graphhopper Dijkstra一对多内存错误



无论我使用的图和服务器的大小,每当我尝试通过dijkstra_one_to_many算法进行路由时,我的堆都会溢出。测试环境是m3.2xlarge, 30gb RAM和2x80gb SSD驱动器。

java.lang.OutOfMemoryError: Java heap space

我已经找到了代码块,这是findEndNode方法中com.graphhopper.routing.DijkstraOneToMany内部的问题:

    while (true) {
        visitedNodes++;
        EdgeIterator iter = outEdgeExplorer.setBaseNode(currNode);
        while (iter.next()) {
            int adjNode = iter.getAdjNode();
            int prevEdgeId = edgeIds[adjNode];
            if (!accept(iter, prevEdgeId))
                continue;
            double tmpWeight = weighting.calcWeight(iter, false, prevEdgeId) + weights[currNode];
            if (Double.isInfinite(tmpWeight))
                continue;
            double w = weights[adjNode];
            if (w == Double.MAX_VALUE) {
                parents[adjNode] = currNode;
                weights[adjNode] = tmpWeight;
                heap.insert_(tmpWeight, adjNode);
                changedNodes.add(adjNode);
                edgeIds[adjNode] = iter.getEdge();
            } else if (w > tmpWeight) {
                parents[adjNode] = currNode;
                weights[adjNode] = tmpWeight;
                heap.update_(tmpWeight, adjNode);
                changedNodes.add(adjNode);
                edgeIds[adjNode] = iter.getEdge();
            }
        }
        if (heap.isEmpty() || isMaxVisitedNodesExceeded() || isWeightLimitExceeded())
            return NOT_FOUND;
        // calling just peek and not poll is important if the next query is cached
        currNode = heap.peek_element();
        if (finished())
            return currNode;
        heap.poll_element();
}
```

它似乎永远找不到结束节点和内部数据结构(最小堆?)增长,增长,增长,直到我用完堆空间。为什么会发生这种情况?

我可以发布我的配置。属性,如果需要的话。感谢Peter为我们提供了这么棒的开源软件

DijkstraOneToMany类目前不打算(容易)从外部使用,例如,它不是线程安全的。您可以切换到简单的Dijkstra,而不需要不同的结束条件,以降低简单情况下的内存需求。

那就是说……可能存在以下问题:

  • 确保缓存对DijkstraOneToMany的调用,因为它创建了大的初始数据结构
  • 再次
  • :只在一个线程中使用它(例如通过ThreadLocal)
  • 它似乎永远找不到结束节点 ->也许你使用QueryGraph与它?这是行不通的,因为我们在QueryGraph中创建了所谓的虚拟节点,DijkstraOneToMany不知道,而是尝试选择下一个塔节点,例如,通过完全避免QueryGraph或手动通过EdgeIterator

感谢Peter为我们提供了这么好的开源软件。

这不仅仅是我一个人的功劳——这是整个社区的努力:)!

相关内容

  • 没有找到相关文章

最新更新