如何解决如何解决OutOfMemoryError:遍历以查找带有巨大图形的所有可能路径时的Java堆空间?
我正在实现遍历图以查找所有可能的路径,并且它与较小的样本图一起使用时效果很好。但是,当我将其带到更大的图(具有1000个顶点)时,程序因OutOfMemoryError:Java堆空间而崩溃。错误发生在第13行的str += src + " -> ";
。
有没有更好的解决方案?谢谢!
这是遍历的代码
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","C","AC","E","AE","");
graph.addEdge("B","BE","");
graph.addEdge("E","F","EF","G","EG","");
graph.addEdge("D","DC","DF","");
graph.addEdge("F","T","FT","FG","");
graph.addEdge("T","TG","");
graph.addEdge("C","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
这是工作示例,但是当我尝试将其用于较大的图形时,程序崩溃。
这是我的getAdjacent,为顶点指定标签,它将返回顶点的邻接表。
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个边界的顶点有多少种可能性?尝试获取该问题的答案,然后重新考虑您的应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。