Objekt kopieren

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
hallo,
mit einer Serialisierung kopiere ich meine Objekte wie folgt:

Code:
public static Object deepCopy(Object o) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            new ObjectOutputStream( baos ).writeObject( o );
            ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
            return new ObjectInputStream(bais).readObject();
            }
        catch (IOException e) {
            e.printStackTrace();
            }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
            }
        return null;
    }

Wenn ich ein umfangreiches Object habe, dann dauert das kopieren eines einzigen Objektes schon mal 500ms (laut Profiler) und wenn ich dann 40 Objekte zu kopieren habe dann warte ich eine ganze Zeit, bis das kopieren fertig ist,
Kann ich da was machen, damit das schneller geht oder muss ich mir eine andere Kopiermethode schreiben bzw, überschreiben?

Vielen Dank,
 
schau doch mal nach, wie groß das Array ist,
überlege, ob du wirklich alle referenzierten Objekte mitkopieren willst,

wenn alle 40 Objekte den gleichen großen Rest-Datenklumpen referenzieren,
dann wird der 40x aufwendig kopiert (und ist dann 40x doppelt im Speicher)
da bietet es sich an, alle 40 gleichzeitig zu speichern, dann wird nur einmal kopiert wobei selbst dann schon fraglich ist,
ob diese 40 Daten nicht lieber die Original-Restdaten referenzieren sollten
 
ich kopiere Nodes eines JTrees und das ist unbedingt erforderlich, dass ich da alle Nodes die ich brauche, kopiere, es sind nicht immer 40, es können auch mal 20 oder 10 sein aber es können eben auch 40 Nodes sein, das blöde ist, dass mein Projekt schon sehr weit fortgeschritten ist und das ich alles mit den DefaultMutableTreeNodes gemacht habe ansonsten hätte ich ja auch von DefaultMutableTreeNode ableiten können und das interface Cloneable implementieren können,

Gibts noch eine Change, dass ich das um einiges Beschleunigen kann?
 
du meinst, außer meiner vollständigen Antwort, die du dezent ignorierst? 😉
 
PollerJava hat gesagt.:
das blöde ist, dass mein Projekt schon sehr weit fortgeschritten ist und das ich alles mit den DefaultMutableTreeNodes gemacht habe ansonsten hätte ich ja auch von DefaultMutableTreeNode ableiten können und das interface Cloneable implementieren können,
Ich würde sagen, mit einer guten IDE lässt sich so ein Refactoring schnell machen.
 
ich weiß nicht genau wie du das meinst, ich benötige unbeding 40 unabhängige Objekte die nicht auf die originalen Objekte verweisen, Könntest du mir da ein Beispiel geben, Mein Code schaut momentan so aus:

Code:
Das folgende Programmstück findet in einer while- schleife statt: 

DefaultMutableTreeNode node = (DefaultMutableTreeNode)deepCopy(butNode);   // Node kopieren
node.getFirstLeaf().setUserObject("irgendwasanderesRein");                                  // das erste Blatt des Nodes verändern
treeModel.insertNodeInto(node, parentNode, 0);                       // den neuen, kopieren Node in meinen JTree einfügen
 
in meinem Posting stand ja auch, dass du die Menge der referenzierten Daten prüfen und überdenken sollst

wenn es viele sind und du immer noch sagst, dass das so sein muss,
dann gehts nicht schneller, auch wenn du mit 100 Seiten Code tausende Objekte einzeln kopierst
 
ok es dauert 16s, dann muss man die halt warten, is eh eine Spezialfunktion in meinem Programm, das muss es dann wert sein,
 
16s für 40 Objekte ist definitiv viel zu lange. Bin mir ziemlich sicher, dass es an deinem Code liegt. Auf den ersten Blick fällt mir sofort auf, dass Du die Streams nie schließt. Auf jeden Fall jeden Stream mit close() schließen, wenn er nicht mehr gebraucht wird. Und den ObjectOutputStream würde ich mal flushen nach dem Schreiben.

Wenn das nichts hilft, vergleiche Deinen Code mal hiermit:
http://www.javaworld.com/javaworld/javatips/jw-javatip76.html?page=2
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben