Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115

    riferimenti agli aggetti

    Salve ragazzi ho un problemino che non so se è risolvibile.
    Provo a spiegare di cosa si tratta:

    Ho a che fare con un hashMap fatta in questo modo:

    codice:
    HashMap<Integer, HashMap<Integer, Grafo>> S = new HashMap<Integer, HashMap<Integer, Grafo>>();
    in altre parole sono 2 hashMap una dentro l'altra; Il mio scopo è creare una nuova istanza dell'oggetto Grafo e inserirla nella mappa (fino a qua niente problemi); Ora siccome di oggetti di tipo Grafo se ne creano parecchi ( parliamo dell'ordine di 100.000) sto cercando di tenere in memoria (o di eliminare ) meno oggetti possibile. Ho provato a far ciò in due modi diversi ma nessuno dei due è andato a buon fine:

    1) Appena inserisco l'oggetto Grafo nella mappa provo ad eliminare l'istanza che ho creato dell'oggetto Grafo stesso, impostandola pari a null; ( mi sembra scontato che cio non funzioni); ho provato questa soluzione perche l'ogetto Grafo ha delle liste al suo interno e quindi impostandolo pari a null pensavo di risparmiare qualcosa invece mi sbagliavo.

    2) Eliminare parte della mappa: Per esempio io ho 10 valori nella mappa di cui i primi 5 non mi servono piu; Provo ad eliminare questi 5 valori ma l'istanza dell'oggetto grafo mi rimane cmq...anche questo sembra scontato a quanto pare.

    Ecco vi starete chiedendo se è tutto cosi scontato perche ci chiedi aiuto??? Vorrei un idea su come eliminare gli oggetti creati e che non mi servono piu...


    codice:
    /        STEP 1 (state-space exploration)
                for (int q = 1; q < n; q++) {
                    Integer contaStato = 0;
                    Integer h = new Integer(1);
                    Integer qPlus = new Integer(q);
                    qPlus++;
                    HashMap<Integer, Grafo> hm2 = S.get(q);
                    for (Map.Entry m : hm2.entrySet()) {
                        Grafo grafo = (Grafo) m.getValue();
                        Set setI = (Set) grafo.getNodeSet();
                        Double c = grafo.getCosto();
    //                System.out.println("insieme X " + setI);
                        iter1 = setI.iterator();
                        boolean ver = true;
                        while (iter1.hasNext()) {
                            Integer i = (Integer) iter1.next();
                            iter2 = g.getEdgeSet(i).iterator(); // tutti gli archi adiacenti a i
                            while (iter2.hasNext()) {
                                Arco a = (Arco) iter2.next();
                                Object j = (Integer) ((a.getX().equals(i)) ? a.getY() : a.getX());
                                if (!setI.contains(j)) {
                                    Grafo g2 = new Grafo();
                                    boolean contr1 = controllo1(g2);
                                    if (!contr1) {
                                        g2.add(a);
                                        Integer contr2 = Djk.djk(g2, 1, j);
                                        Double costoAlb = g2.getCosto() + a.getValue() + c;
                                        g2.SetCosto(costoAlb);
                                        if ((W.contains(j) && (contr2 <= numeroHop ) && costoAlb<upperBound) || 
                                                (!W.contains(j) && contr2 <= numeroHop - 1 && costoAlb<upperBound )) {
                                            stato = qPlus;
                                            if (S.containsKey(qPlus)) {
                                                S.get(qPlus).put(h, g2);
    //                                            System.out.println(contaStato++);
                                            } else {
                                                HashMap hm4 = new HashMap();
                                                hm4.put(h, g2);
                                                S.put(qPlus, hm4);
    //                                            System.out.println(contaStato++);
                                            }
                                        }
                                        h++;
                                    } else {
                                        Double costoAlb = g2.getCosto() + c;
                                        g2.SetCosto(costoAlb);
                                        suppl.put(key, g2);
                                        if(costoAlb<upperBound)
                                            upperBound=costoAlb;
                                        key++;
                                        ver = false;   
                                    }
                                    g2 = null;
                                }
                            }
                            if (!ver) {
                                break;
                            }
                        }
                        grafo = null;
    
                    }
                    S.remove(stato-1);
    
                }
            
                
             } catch (NullPointerException c) {
            } catch (Exception e) {
                e.printStackTrace();
            }
    questa è una bozza del codice: bisogna guardare la seguente chiamata: Grafo g2=new Grafo(); come si può vedere g2 viene aggiunto nella mappa S. Ecco se io elimino parte della mappa non concludo nulla perchè le istanze di Grafo che non mi servono piu, rimangono ancora nel JVM.

    No so se c'e una soluzione a ciò. Ditemi cosa ne pensate perfavore..

    Grazie in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115
    dimenticavo: Ho provato a Serializzare L'oggetto grafo..ma niente da fare...l'istanza rimane se finchè non si conclude l'ultimo for...

    forse trascuro qualcosa...bho non so....

  3. #3
    Gli oggetti ancora referenziati da un puntatore non vengono eliminati. E comunque anche se non fossero piu' referenziati non è detto che vengano eliminati subito, dipende dal garbage collector.
    Quindi la tua prima soluzione non funziona visto che anche se setti il puntatore iniziale a null, c'è l'hashmap che si tiene l'oggetto (ovviamente non è una copia ma è lo stesso che è stato rilasciato dal tuo puntatore) quindi non verra' cancellato...
    O rivedi il codice oppure il max che puoi fare e' scrivere un codice che elimini il Grafo dalle HashMap dove sono referenziate per dereferenziarle e sperare che il garbage collector li elimini.
    lolide
    Java Programmer

    Informati

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115
    Hmmm immaginavo che non ci fosse soluzione...

    ma se anziche creare 1000 Istanze creassi 1000 Copie ( con il metodo clone) le risorse sono sempre quelle????

  5. #5
    Originariamente inviato da cobraa
    Hmmm immaginavo che non ci fosse soluzione...

    ma se anziche creare 1000 Istanze creassi 1000 Copie ( con il metodo clone) le risorse sono sempre quelle????
    No, anzi clonando un oggetto Grafo lo copi allocando memoria per un altro oggetto quindi raddoppi l'uso della memoria.
    lolide
    Java Programmer

    Informati

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115
    Perfetto...almeno mi sono chiarito il dubbio...cercherò di ottimizzare il codice quanto piu possibile...

    grazie per l'aiuto

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.