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.