如何解决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个边界的顶点有多少种可能性?尝试获取该问题的答案,然后重新考虑您的应用程序。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...