Announcement

Collapse
No announcement yet.

Save Object to File / Load Object From File

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Save Object to File / Load Object From File

    Moin,

    Ich habe ein Programm geschrieben, das aus einer XML Datei Objekte erzeugt.
    (Die Objekte sind alle von TObject abgeleitet.)
    Dabei werden Alle Objekte in einem Überobject gesammelt.
    Da das mehrere Millionen XML Zeilen sind und einige hundert Tausend Objekte erzeugt werden, dauert das Pharsen und erstellen der Objekte auf einem P4-1.7Ghz rechener ca. 23 sec.
    Das Programm wird auch auf älteren Rechnern eingesetzt z.b. P2-300). Das Starten des Programm dauert damit mehrere Minuten.
    Um das ganze zu beschleunigen möchte ich mir ein Cache einrichten. Dazu möchte ich das Überobject mit allen unterobjekten einfach als Datei abspeichern. Und beim nächsten Programmstart wieder laden.

    Ich hatte vor ein paar Jahren mal eine relativ und Simple methode gefunden, das zu machen. Aus diversen gründen habe ich mich damals gegen diese methode entschieden und aus meinem Quellcode gelöscht.

    Da ich genau so etwas jetzt brauche wollte ich fragen, ob jemand Ahnung hat, wie das ging. Ich habe schon einige Zeit gesucht, aber nichts gefunden.

    Danke.

  • #2
    Originally posted by shadows View Post
    Da das mehrere Millionen XML Zeilen sind und einige hundert Tausend Objekte erzeugt werden, dauert das Pharsen und erstellen der Objekte auf einem P4-1.7Ghz rechener ca. 23 sec.
    Das Programm wird auch auf älteren Rechnern eingesetzt z.b. P2-300). Das Starten des Programm dauert damit mehrere Minuten.
    Sind nicht auch einige ganz große Anwendungen (AFAIK auch im Behördenbereich ) genau wegen der Performanceprobleme bei XML-Persistenz gescheidert?

    Originally posted by shadows View Post
    Um das ganze zu beschleunigen möchte ich mir ein Cache einrichten. Dazu möchte ich das Überobject mit allen unterobjekten einfach als Datei abspeichern. Und beim nächsten Programmstart wieder laden.
    Ich würde mir überlegen da ganze XML in die Tonne zu treten und ein ganz normales relationales DBMS einzusetzen und jeweils nur den benötigten Daten-Teil zu "verobjekten".

    Comment


    • #3
      Auf einem AMD X64 3500+ dauert der Startvorgang 6 Sekunden.
      Wenn es auf schnellen systemen auch langsam gehen würde, könnte ich den Startvorgang für mehrkernprozessoren auslegen.
      Und wenn der Mann, der die Datenbank pflegt Ahnung davon hätte, könnte man auch einige hundert tausend Zeilen XML code weniger haben.
      XML wurde gewählt, weil das Programm auf manchen Systemen auch ohne Installation von CD Starten soll.
      Die XML Daten können vom Benutzer sowieso nicht verändert weden. Sie sind gepackt und verschlüsselt.

      Edit: Von XML weg zu gehen ist keine Option.

      Edit2: Es darf auch nicht aufwendig sein. Da das Cachen nur Bonus ist, und nicht bezahlt wird.
      Zuletzt editiert von shadows; 09.02.2008, 11:26.

      Comment


      • #4
        Originally posted by shadows View Post
        Wenn es auf schnellen systemen auch langsam gehen würde, könnte ich den Startvorgang für mehrkernprozessoren auslegen.
        So einfach wird das nicht. Da wird dir schon die VCL, COM und die Tatsache das aus einer Datei (?) gelesen wird das leben schwer machen

        Originally posted by shadows View Post
        Und wenn der Mann, der die Datenbank pflegt Ahnung davon hätte, könnte man auch einige hundert tausend Zeilen XML code weniger haben.
        Redundante Daten? Kannst du nicht einen Menüpunkt anbieten um solche Datenungereimtheiten zu beseitigen?
        Originally posted by shadows View Post
        XML wurde gewählt, weil das Programm auf manchen Systemen auch ohne Installation von CD Starten soll.
        Die XML Daten können vom Benutzer sowieso nicht verändert weden. Sie sind gepackt und verschlüsselt.
        Und? Es gibt für Delphi diverse DB-Komponenten (ADS Local Server, TurboDB, Absolute Database) die all das können.

        Originally posted by shadows View Post
        Edit2: Es darf auch nicht aufwendig sein. Da das Cachen nur Bonus ist, und nicht bezahlt wird.
        Es ist eher die Frage ob ich als Kunde/Nutzer das Programm überhaupt noch einsetzen würde wenn es mehrer Minuten zum laden benötigt. Mehrer Minuten Ladezeit bedeutet für mich eher das dieses Programm unbenutzbar ist.

        Comment


        • #5
          Originally posted by Bernhard Geyer View Post
          So einfach wird das nicht. Da wird dir schon die VCL, COM und die Tatsache das aus einer Datei (?) gelesen wird das leben schwer machen


          Redundante Daten? Kannst du nicht einen Menüpunkt anbieten um solche Datenungereimtheiten zu beseitigen?

          Und? Es gibt für Delphi diverse DB-Komponenten (ADS Local Server, TurboDB, Absolute Database) die all das können.


          Es ist eher die Frage ob ich als Kunde/Nutzer das Programm überhaupt noch einsetzen würde wenn es mehrer Minuten zum laden benötigt. Mehrer Minuten Ladezeit bedeutet für mich eher das dieses Programm unbenutzbar ist.
          Es sind genaugenommen 8 Dateien, aus denen gelesen wird.
          Ausserdem wirds nicht bezahlt.

          Da das eine relativ komplexe Datenbank ist, wäre das einiges an Aufwand.
          Und das bezahlt er nicht.

          Kunde wünschte auch, das die Daten via XML ins Internet übertragen werden.
          etc. (Internet ist zwar doch nicht gekommen aber der Kunde bezaht auch kein umstieg auf eine Datenbank)

          Das ist ja auch nur auf Uralt-Rechnern. Wenn ich mir einen Tretroller als Vortbewegungsmittel aussuche kann ich mich nicht darüber beschweren, das er keine Concord geschwindigkeit hat.
          Kunde sagte Ausserdem, das das ok ist, da das nur beim starten so lange dauert.

          Und ich kann nicht alles umsonnst machen. Für den Kleckerpreis den er Bezahlt bekommt er nirgendwo was, was halb so viel bietet.

          Comment


          • #6
            Ok,

            wenn du unbedingt bei XML bleiben willst.

            Bei XML kannst du das einlesen z.B per SAX erledigen lassen oder den DOM komplett aufbauen lassen was natürlich um einiges bremst.

            Comment


            • #7
              Ich parse selber. Und erzeuge für jedes XML Objekt ein richtiges Objekt.
              Ich bilde im Speicher eine Relationelle Datenbank ab. Die ich mir auch über Hashtabels verknüpfe und dann den Pointer merke. Deswegen geht nachher der Zugriff sehr schnell.

              Wie gesagt, suche ich eine möglickkeit die bestehenden Objekte auf Platte zu Speichern und nachher wieder ein zu lesen. Um den Startvorgang Performanter zu machen.

              Ausserdem, wenn ich alles als DOM struktur abbilden würde, würde mir der Speicher um die Ohren fliegen. Dann brauche ich ca. 512 MB Arbeitsspeicher.
              Da das Programm auch auf Win 95 mit 128 MB Laufen soll geht das nicht.
              Deswegen musste ich auch die XML datei in 8 Dateien aufteilen.
              Die einzigste möglichkeit mit den mir vorgegebenen Vorgaben und Resourcen unzugehen.

              Edit: Das Programm (1151kB) mit Daten umfast ca. 1,4 GB (2 volle CDs)

              Das Programm ist ja auch schon fertig und ist auch schon abgenommen. Ich wollte es nur auf eine möglichst einfache (und kostenlose) weise schneller machen.

              Edit2: Die XML Datenbank (3,2 MB gepackt) hat als Access Datenbank 118MB.
              Edit3: Die Laufende Anwendung benötigt mom. 85MB.
              Zuletzt editiert von shadows; 09.02.2008, 13:43.

              Comment


              • #8
                Speichere doch als "binäres" XML. Die Hauptrechenzeit wird vermutlich mit Stringvergleichen "drauf gehen". Wenn du nun statt "richtiger" String-Tags binäre Tags verwendest solltest du um einiges schneller werden.

                Ich würde auch mit Tools wie AQTime die CPU-Zeitenfresser mir mal bestimmen lassen. Für "normales" Delphi kannst du auch komponenten wie FastMM, FastCodeLibraries verwenden um noch einiges an Performance herausholen.

                Comment


                • #9
                  Danke für die Tipps, werde ich mir mal ansehen.

                  Edit: Das FastMM4 beschleunigt den Start bei diesem Programm um 8,8%. Einziges Problem ist, das sich das Programm nicht mehr beenden lässt. Ich werde also noch mal ein bischen rumbasteln.

                  Edit2: Tja, schade, Ich kann FastMM4 nicht verwenden. Eine eingekaufte komponente Verursacht damit MemoryLeaks.
                  Zuletzt editiert von shadows; 09.02.2008, 14:47.

                  Comment

                  Working...
                  X