Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    Ciao a tutti! sto lavorando su un progetto che utilizza come struttura un grafo e la ricerca di path su questo grafo. purtroppo di tanto in tanto mi si presenta questo errore e non capisco il perchè in quanto:
    1) su 10 volte che lancio 8 non da problemi e 2 si... (se fosse un errore del codice non ci sarebbero esiti positivi! )
    2) ho provato ad aumentare la memoria a disposizione di eclipse settando i parametri come già discusso in un altro topic, ma niente... sempre lo stesso errore..!

    il problema principale è data da una funzione findPath di cui vi posto il codice:

    codice:
    public List<Integer> findPath(int node1, int node2)
    	{
    		inRange(node1);
    		inRange(node2);
    		int root = node1;
    		UndirGraph tree = new UndirGraph(size());
    		boolean[] inS = new boolean[size()];
    		List<Integer> Q = new LinkedList<Integer>();
    		inS[root - 1] = true;
    		Q.addAll(getNeighbors(root)); // Put
    		while (!Q.isEmpty())
    		{
    			int v = Q.remove(0); // Get
    			if(v < 0)
    				root = -v; // sets new root node
    			else if(v == node2)
    			{
    				tree.add(root, v);
    				// go back from node2 to node1 on the tree
    				List<Integer> result = new LinkedList<Integer>();
    				result.add(0, node2);
    				int node = node2;
    				while (node != node1)
    				{
    					for (int i = 1; i <= tree.size(); i++)
    						if(tree.edge(i, node))
    						{
    							node = i;
    							break;
    						}
    					result.add(0, node);
    				}
    				return result;
    			} else if(!inS[v - 1])
    			{
    				tree.add(root, v);
    				inS[v - 1] = true;
    				Q.add(new Integer(-v)); // adds father before his neighbors
    				Q.addAll(getNeighbors(v)); // Put
    			}
    		}
    		// there is no path from node1 to node2
    		return new LinkedList<Integer>();
    
    	}

    io non so cosa fare... qualcuno può darmi una mano per favore?? grazie mille!!
    PS. il grafo che sto usando è piccolo!! solo 36 nodi

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76
    per una corretta risposta devi dire:
    che tipo di grafo è? ciclico?pesato?
    che tipo di percorso devi trovare? il minimo?
    il grafo come è rappresentato nei tuoi codici?

    la ricerca di un percorso in un grafo (generico) non è una cosa banale, ci sono stati un sacco di signori che hanno passato parte della loro vita a studiare questo tipo di problemi, prova ad affidarti a loro e ai loro algoritmi (i più famosi):
    http://it.wikipedia.org/wiki/Algoritmo_di_Dijkstra
    http://it.wikipedia.org/wiki/Algorit...Floyd-Warshall

    una soluzione potrebbe essere anche la programmazione dinamica

  3. #3
    si tratta di un grafo NON pesato, NON orientato e quello che voglio io è il calcolo di un semplice path tra 2 nodi.. il problema del cammino minimo è stato già affrontato con successo utilizzando uno degli algoritmi che mi hai consigliato (ma ti ringrazio lo stesso! ... )..
    io vorrei solo sapere se a qualcuno di voi è mai capitato un errore del genere, in quanto in 6 anni di programmazione (di software MOLTO più pesanti di questo) non mi è mai successo

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    Ciao
    errori del genere mi sono capitati, in particolare usando netbeans, nelle web application.
    parzialmente avevo risolto dando nella configurazione del tomcat, in particolare alla vm, i parametri -Xms512m -Xmx1024m.
    inoltre ho rivisto tutte le connessioni al db stando attendo di mettere ovunque i finally per chiudere le connessioni e infine ricontrollando i metodi che aprivano strem verso il file system, apertura di un file, modifiche o altro, nel mio caso usando iText avevo dimenticato di mettere un finally che chiudesse gli stream una volta finito il lavoro.
    messo a posto tutto ciò non ho avuto più problemi
    tomcat 6.016
    netbeans 6.1

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76
    findPath è richiamato all'interno di qualche ciclo?

    il punterei il dito sui tre cicli annidati...che molto probabilemtne vanno a intanziare memoria, con l'aiuto della classe (probabilmente fatta da te) UndirGraph

    i metodi add e edge che fanno? ma soprattutto come lo fanno?

    in modo molto contandino un primo test sarebbe quello di commentare brutalmente (se possibile e partendo da quello più interno) i cicli così da focalizzare in qualche modo l'attenzione (anche se non è detto)

  6. #6
    la classe ci è stata fornita da un professore universitario; comunque ho fatto un semplice test con lo stesso grafo e con un for che mi scorre tutti i nodi, e per ogni nodo calcola il path da esso al nodo 1 (es. semplice ma efficace )... risultato: nessuna eccezione.
    A questo punto devo ricontrollare il mio codice, anche se non c'è nessun ciclo strano (altrimenti su 10 volte che lo lancio 8 non risulterebbero esecuzioni senza errore!).. ho un semplice while in cui richiamo questa findPath...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.