如何解决OutOfMemoryError:Java堆空间在遍历时用巨大的图查找所有可能的路径?
我正在实现一个图遍历来查找所有可能的路径,它可以很好地处理一个小样本图。但是当我把它放到一个更大的图(有1000个顶点)上时,程序会崩溃,并出现OutOfMemoryError:Java堆空间。错误发生在如何解决OutOfMemoryError:Java堆空间在遍历时用巨大的图查找所有可能的路径?,java,recursion,data-structures,out-of-memory,graph-traversal,Java,Recursion,Data Structures,Out Of Memory,Graph Traversal,我正在实现一个图遍历来查找所有可能的路径,它可以很好地处理一个小样本图。但是当我把它放到一个更大的图(有1000个顶点)上时,程序会崩溃,并出现OutOfMemoryError:Java堆空间。错误发生在str+=src+“->”在第13行 有没有更好的解决办法?谢谢 这是遍历的代码 private void displayPathRec( String src, String dest, String str ) { DSALinkedList ll = null; DSAGr
str+=src+“->”代码>在第13行
有没有更好的解决办法?谢谢
这是遍历的代码
private void displayPathRec( String src, String dest, String str )
{
DSALinkedList ll = null;
DSAGraphVertex v = null;
ll = getAdjacent( src );
Iterator iter = ll.iterator();
// Base Case: found endLabel
if( !src.equals( dest ) )
{
str += src + " -> ";
while( iter.hasNext() )
{
v = (DSAGraphVertex) iter.next();
displayPathRec( v.getLabel(), dest, str );
}
}
else
System.out.println(str + dest);
}
我的图表样本
graph.addVertex("A", 25);
graph.addVertex("B", 60);
graph.addVertex("C", 45);
graph.addVertex("D", 75);
graph.addVertex("E", 95);
graph.addVertex("F", 85);
graph.addVertex("T", 115);
graph.addVertex("G", 105);
graph.addEdge("A", "B", "AB", "");
graph.addEdge("A", "D", "AD", "");
graph.addEdge("A", "C", "AC", "");
graph.addEdge("A", "E", "AE", "");
graph.addEdge("B", "E", "BE", "");
graph.addEdge("E", "F", "EF", "");
graph.addEdge("E", "G", "EG", "");
graph.addEdge("D", "C", "DC", "");
graph.addEdge("D", "F", "DF", "");
graph.addEdge("F", "T", "FT", "");
graph.addEdge("F", "G", "FG", "");
graph.addEdge("T", "G", "TG", "");
graph.addEdge("C", "F", "CF", "");
DSALinkedList adjList = null;
DSAGraphVertex v = null;
String src = "A", dest = "G";
graph.displayPath( src, dest );
输出
A -> B -> E -> F -> T -> G
A -> B -> E -> F -> G
A -> B -> E -> G
A -> D -> C -> F -> T -> G
A -> D -> C -> F -> G
A -> D -> F -> T -> G
A -> D -> F -> G
A -> C -> F -> T -> G
A -> C -> F -> G
A -> E -> F -> T -> G
A -> E -> F -> G
A -> E -> G
这是一个工作示例,但当我尝试将其用于较大的图形时,程序崩溃
这是我的GetNextant,给定顶点的标签,它将返回顶点的邻接列表
public DSALinkedList getAdjacent( String inLabel )
{
DSAGraphVertex v = null;
if( !hasVertex(inLabel) ) // If inLabel does not exists means vertex is not exists
throw new IllegalArgumentException("Label does not exist");
else
{
boolean found = false;
Iterator iter = vertices.iterator(); // Iterate through vertices becase we want to get
// link list of vertex and link list is fields of vertex
// ASSERTION: Iterate over vertices (to search for the desired vertex)
while( iter.hasNext() && !found )
{
v = (DSAGraphVertex)iter.next();
found = v.getLabel().equals(inLabel);
}
}
return v.getAdjacent(); // Return vertex list
}
这在递归逻辑中不是一个问题,否则会出现stackoverflow异常而不是完整堆。听起来像是在循环中遍历图的相同节点
如果看不到数据集和整个逻辑,就很难理解问题,但是尝试执行检查以避免在漫游过程中出现循环(如果某个节点已被访问,请停止),并查看这是否解决了问题。在收集大量html作为字符串时,我也面临这种问题。我认为应该使用StringBuilder类而不是String,因为每次添加String时都会创建一个新对象
如果您的代码在生产/测试环境中(不是在本地)中断,那么您应该检查服务器的内存和CPU分配,以及使用哪种垃圾收集器。(我用的是G1GC)。你知道一个顶点有1000个边界的可能性有多少吗?尝试回答这个问题并重新思考您的应用程序。这些类在哪里:DSALinkedList、DSAGraphVertex?getNexture(..)方法做什么?您可以发布一个功能完整的示例吗?DSALinkedList相当于java中的。DSAGraphVertex表示每个顶点的顶点。请参考我更新的问题,了解GetNextant方法将做什么