gezieltes schreiben in ein xml file

  • gezieltes schreiben in ein xml file

    hallo leute,

    ich habe ein array aus dictionaries. das array schreibe ich in eine datei mit
    [meinarray writeToFile:filePath atomically:YES];

    wenn das file noch nicht existiert geht das ganze natürlich recht schnell.
    wenn es schon existiert und ich hänge an das array ein neues dict dran
    muss ich das bestehende file erst auslesen, dann das dict anhängen und
    dann das array wieder in die datei schreiben.

    bei wenigen dicts geht das ganze auch sehr schnell.
    ich hab mal ein paar tests gemacht. bei 100000 dicts wird selbst das auslesen zur
    geduldsprobe. die datei ist dann auch mittlerweile über 300 mb gross. ein dict hinzufügen
    hab ich dann gar nicht erst probiert.

    mit 10000 dicts (ca. 32mb) geht das lesen relativ schnell. ca. 1-2 sekunden.
    beim lesen, dict hinzufügen und wieder schreiben dauert es schon etwas länger.

    ich weiss ich hab etwas weit ausgeholt. jetzt zu meiner frage:
    gibt es eine möglichkeit in das bestehende xml file direkt zu schreiben, ohne das ich es vorher auslesen muss um ein dict anzuhängen?
    wenn das geht ergibt sich gleich die nächste frage: besteht die möglichkeit auf die gleiche art
    und weise ein in dem xml file bestehendes dict durch ein neues zu ersetzen?

    sascha
  • mh,
    wenn du so viele datensätze hast, wäre es dann nicht besser du machst das über ne datenbank.
    im prinzip ist doch genau das was du meinst einer der vorteile einer db, du must nicht immer das ganze geraffel auslesen.
  • Es wird umständlich, wenn man kein Datenbank verwenden möchte.

    Meine Lösung würde so aussehen:

    1. aus Dict ein XML-String generieren
    2. die zu schreibene Datei mit fopen zum Schreiben öffnen
    3. auf richtige Position mit fseek setzen und anschließend XML-String schreiben
    Aus macfreakz wurde Apfelbeisser …
  • Original von macfreakz
    Es wird umständlich, wenn man kein Datenbank verwenden möchte.

    Meine Lösung würde so aussehen:

    1. aus Dict ein XML-String generieren
    2. die zu schreibene Datei mit fopen zum Schreiben öffnen
    3. auf richtige Position mit fseek setzen und anschließend XML-String schreiben


    Puhh, das duerfte aber ziemlich interessant werden die Richtige Position zu finden.
    Dann vielleicht lieber mit XPath navigieren, denn immerhin handelt es sich ja um XML.


    Manfred
  • Original von macfreakz
    Es wird umständlich, wenn man kein Datenbank verwenden möchte.

    Meine Lösung würde so aussehen:

    1. aus Dict ein XML-String generieren
    2. die zu schreibene Datei mit fopen zum Schreiben öffnen
    3. auf richtige Position mit fseek setzen und anschließend XML-String schreiben


    würde schon funktionieren, aber wie er es ja schon selbst gesagt, je größer sein xml-file umso länger dauert das alles.
    Muß es unbedingt xml sein??? vielleicht wäre es besser wenn du das binär speicherst, dadurch fallen schon mal alle xml-tags weg und dein file wird entsprechend klein.
  • @wolf_10de: ich bin nicht der macuser! :D

    Vielleicht will macuser, dass die Dokument von anderen Programmen gelesen werden können. Das ist der Sinn von XML.

    Ja, richtige Position zu finden wird sehr schwierig sein, vor allem damit die beste Performance zu erzielen.

    Wenn Dict immer am Ende hinzufügt werden soll, wäre das kein Problem, weil man die Position so berechnen kann, dass man die Position am Schluss setzt und die Gesamtlänge mit der Länge von dem letzten XML-Tag subtrahiert.
    Aus macfreakz wurde Apfelbeisser …
  • eine idee hätte ich noch, wenn du es doch mit ner Datenbank machst, und nur bei bedarf einen xml-dump generierst, damit hast du die vorteile von ner db und über xml den austausch mit anderen programmen
  • Original von Tom9811
    Tom9811,5556334343355

    Den kenne ich nicht. An seinem Nick erkenne ich aber, dass er eine gebrochene Persönlichkeit hat und rational ist.

    wer hat eine gebrochene persönlichkeit?

    das waren ja ne ganze menge anregungen.
    das der vorschlag mit einer richtigen db kommt war mir klar. so war es bis jetzt auch.
    das problem (mit sqlite) ist, das es nicht netzwerkfähig ist, noch kann ich das datenbankfile
    auf einen server ablegen, damit mehrere user drauf zugreifen können. deshalb der umweg über das
    xml file.

    ich werde mal versuchen das array in nsdata zu wandeln und dann zu schreiben. mal sehen was
    das bringt.

    sascha
  • 9811,5556334343355 ist eine gerbochen-rationale Zahl, wenn meine Mathe-Kenntnisse nicht der Demenz (Ihr wisst ja: Das Alter) zum Opfer gefallen sind.

    Zurück zum Thema:
    Wieso glaubst du, ein XML-File sei netzwerkfähig? Eine Datei ist eine Datei ist eine Datei. Wenn da mehrere drauf herumschreiben, wirst du wohl Locking implementieren müssen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • nein netzwerkfähig ist eine datei natürlich nicht. aber ich kann sie auf einen server legen
    damit mehrere user darauf zugreifen können. was mit sqlite leider nicht geht.
    eine "richtige" datenbank wie mysql will ich nicht nehmen, da der aufwand für einrichtung nicht
    in relation zum programm steht. auch die backupmöglichkeiten sind nicht so unkompliziert.


    ich hab das ganze jetzt als nsdata gespeichert. geht auf jeden fall schneller. und die datei ist nur noch 10% so gross wie vorher.