無論我使用的圖形和服務器的大小如何,只要我嘗試按dijkstra_one_to_many算法進行路由,我就會溢出我的堆。測試環境是一個m3.2xlarge,內存爲30GB,2x80gb SSD驅動器。Graphhopper Dijkstra一對多內存錯誤
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();
}
```
這似乎從未找到結束節點和內部數據結構(分堆?)的增長和增長,直到我用完堆空間。這是爲什麼發生?
如果需要,我也可以發佈我的config.properties。感謝Peter爲我們製作了一款非常棒的開源軟件。
那麼,你有沒有嘗試增加你的堆空間? (圖的大小和當前的堆大小是多少?)假設你的(未示出)isMaxVisitedNodesExceeded()正常工作,你沒有將你的'heap'字段變量運行到無窮大...... – BadZen
I通過jvm args將堆大小設置爲27GB。北美pbf的圖形是4GB。也許我可以降低訪問的最大節點數,但我認爲我沒有正確使用算法類。 – Chadderall