グラフのサイズや使用するサーバーに関係なく、dijkstra_one_to_manyアルゴリズムでルーティングしようとすると、ヒープがオーバーフローします。テスト環境は、30GBのRAMと2×80GBのSSDドライブを搭載したm3.2xlargeです。Graphhopper Dijkstra 1対多のメモリエラー
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();
}
```
エンド・ノードおよび内部データ構造を見つけることはありませんように見える(分:
java.lang.OutOfMemoryError: Java heap space
私はfindEndNode方法でcom.graphhopper.routing.DijkstraOneToMany
内部の問題であるコードブロックを突き止めましたヒープ?)私がヒープスペースを使い果たすまで、成長し、成長し、成長する。なぜこうなった?
config.propertiesも必要に応じて投稿できます。素晴らしいオープンソースソフトウェアをまとめてくれたPeterに感謝します。
さて、ヒープスペースを増やしてみましたか? (グラフの大きさと現在のヒープサイズは何ですか?)あなたの(表示されていない) 'isMaxVisitedNodesExceeded()'が正常に動作していて、 'heap'フィールド変数を無限大にしていないと仮定します... – BadZen
I jvm argsを使ってヒープサイズを27GBに設定します。北アメリカpbfのグラフは4GBです。たぶん私は訪問されたノードの最大数を下げることができますが、私はアルゴリズムクラスを正しく使用しているとは思わない。 – Chadderall