Einzelnen Beitrag anzeigen

mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#20

AW: Freigabe von Objekten zeitaufwändig?

  Alt 31. Aug 2010, 08:29
Um noch eine letzte Rückmeldung zu geben - für den Fall, dass es noch einen interessiert - inzwischen ist auch die letzte Bremse beseitigt.

Kurzer Hintergrund: Die Anwendung plant an Hand von BoundingBoxen die Verteilung von Anzeigen innerhalb eines Katalogs. Dabei stehen verschiedene Anzeigen in einer Beziehung zueinander und müssen nach bestimmten Regeln auf gleichen, vorhergehenden oder nachfolgenden Doppelseiten platziert werden. Die Daten kommen als XML an, werden verarbeitet und es wird XML wieder weggeschrieben.

Um verschiedenste Umbruchvarianten durchzuprobieren, werden baumartig verschiedene Umbruchzweige geöffnet und die Anzeigen (da sie innerhalb jeder Umbruchvariante angepackt und mit Zusatzdaten versehen werden) geklont. Um es kurz zu machen: Die Anwendung klont wie wahnsinnig und erzeugt viele, viele, viele, viele Objekte.

Innerhalb des Klonens einer Anzeige gab es ein letztes Problem:
  • Zu einer Anzeige gibt es Schnittkanten. Diese Schnittkanten geben vor, wo eine Anzeige zerteilt werden darf, um in mehreren Blöcken auf der Seite zu erscheinen
  • Die Schnittkanten werden bei der Erzeugung des Objektes durch Analyse des übergebenen XML erzeugt

Also etwa:
Code:
TUmbrObjekt.Create ( XML: IXMLDOMNode );
begin
  [...]
  AnalyzeXml ( XML );     // Analyse des uebergebenen XML
  [...]
end;
Die Methode AnalyzeXML ist dann dafür zuständig, dass die entsprechenden Unterobjekte, welche die einzelnen Schnittkanten repräsentieren, erzeugt werden.

Grob gesagt (handelt sich hier um eine extreme Vereinfachung) habe ich also ein Objekt folgenden Aufbaus:
Code:
TUmbrObjekt = class
  [...]
  private
    FXML: IXMLDOMNode;  // Hier wird das XML der Initialisierung vorgehalten
    FSchnittkanten: Array Of TSchnittkante;
  [...]
end;
Das Objekt kann sich selbst aber auch klonen. Und dabei bin ich folgendermaßen vorgegangen:
Code:
function TUmbrObjekt.Clone: TUmbrObjekt;
var
  i: Integer;
begin
  Result := TUmbrObjekt.Create ( FXML );
  for i := 0 to High ( FSchnittkanten ) do begin
    // self.FSchnittkanten[i] an Result anhängen
  end;
end;
Und genau darin lag der Fehler: Sowohl im Create werden Schnittkanten durch das XML erzeugt, als auch während des Klon-Vorgangs zusätzlich noch einmal an den Klon angehängt. Auf diese Weise habe ich die Anzahl der Unterobjekte explosionsartig vermehrt.

Nachdem ich das aufgeräumt hatte, konnte ich die Bearbeitungszeit dramatisch verkürzen. Aus den ursprünglichen knapp 80 Minuten wurden bei gleichen Daten 1,5 Minuten. Mit dem Gesamtdatenbestand, der letzten Endes einen Katalog von etwa 800 Seiten erzeugt, schrumpfte die Bearbeitungszeit von über 4 Stunden auf 5 Minuten.

Vielen Dank für die Hilfe!!!!

Matthias Jenke
  Mit Zitat antworten Zitat