Ankündigung

Einklappen
Keine Ankündigung bisher.

große XML-Datei in annehmbarer Zeit durchsuchen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • große XML-Datei in annehmbarer Zeit durchsuchen

    Hallo,
    ich versuche schon seit geraumer Zeit eine XML-Datei von ca. 4MB größe in angemessener Zeit von ca. 2-4sec zu durchsuchen. Bisher hatte ich leider weder mit dem Suchalgo noch mit der benötigten Zeit erfolg. Der durchlauf dauerte ca. 10sec. auf einem 1GHz Rechner.

    Es handelt sich um folgende Datenstruktur:

    <Bauteilkatalog>

    <Bauteil ID="SIC22323">
    <Details>
    <Beschreibung1>Beschreibung1 des Bauteils</Beschreibung1>
    <Beschreibung2>Beschreibung2 des Bauteils</Beschreibung2>
    <Einsatz>Gerät 4223</Einsatz>
    </Details>
    <PDF>
    <Bauvorschrift>CBV\SIC22323.pdf</Bauvorschrift>
    <Datenblatt>CDB\SIC22323.pdf</Datenblatt>
    </PDF>
    </Bauteil>

    <Bauteil ID="SIC11323">
    <Details>
    <Beschreibung1>Beschreibung1 des Bauteils</Beschreibung1>
    <Beschreibung2>Beschreibung2 des Bauteils</Beschreibung2>
    <Einsatz>Gerät 1113</Einsatz>
    </Details>
    <PDF>
    <Bauvorschrift>CBV\SIC11323.pdf</Bauvorschrift>
    <Datenblatt>CDB\SIC11323.pdf</Datenblatt>
    </PDF>
    </Bauteil>

    </Bauteilkatalog>

    Es handelt sich also um einen Bauteilkatalog mit ca. 4000 eingetragenen Bauteilen.
    Dafür gibt es eine Web-Oberfläche, die die Eingabe eines Suchbegriffs ermöglicht. Wenn jetzt jemand z. B. "Gerät 1113" eingeben sollte, müssten ALLE <Details> des Bauteiles SIC11323 sowie die Tags unter <PDF> auf dieser Webseite als Suchergebnis erscheinen.

    Bisher machte ich folgenden Ansatz:

    1. Benutzte Standard-Parser mit startElement, endElement, cdata
    2. übergab die Variable $startElement an Funktion cdata
    3. Zwischenspeichern aller Elemente eines Bauteils (also von <Bauteil ID...> bis </Bauteil> in ein Array.
    3. überprüfte jede Zeile in der Funktion cdata auf den Suchinhalt
    4. Wenn Suchinhalt ingendwann bis Ende des Bauteils gefunden, übergebe Array an Zeigefunktion

    Da aber die Cdata Funktion pro Tag mehrmals aufgefufen wird, bekomme ich keine sinnvolle Ergebnisse.
    Weiterhin dauert der Suchdurchlauf durch das Zwischenspeichern und vermutlich durch das durchsuchen der Strings eine ganz schön lange Zeit.

    Würde mich sehr freuen wenn mir jemand zu diesem Problem einen hilfreichen Tip hättte... Auch wenn es nicht schneller geht, eine idee für einen Suchalgo wäre klasse.

    Danke,
    Joachim Schneider


  • #2
    Mein Tipp wäre wohl das einmal einlesen und dann ab damit in eine Datenbank. Vermute aber dass das nicht so einfach geht bei dir weil andere Programme auch da drauf schreiben / editieren...

    Google sagt das hier bei "PHP XML Parser" -->
    http://www.ideenreich.com/programmie...hp-expat.shtml

    Klingt intressant! - EDIT: Oops wenn ich das richtig überflogen habe verwendest du das bereits!

    Kommentar


    • #3
      Ich habe gehört, das dieses Script sehr schnell arbeitet:

      http://www.media-palette.de/tools/xml-line/

      wilko

      Kommentar


      • #4
        Danke...

        Danke für euere Beiträge. Hab mir vor Allem die Klasse XML-Line etwas näher angeschaut. XML-Line ist wie gemacht für das Auffinden von Informationen in XML-Dateien und gibt als Suchergebnis ein Array zurück, über dieses man nahezu alle weiter Informationen über den Suchbegriff bekommt. Zudem hat es ein gutes, deutsches Tutorial.
        Der nachteil ist aber die Geschwindigkeit der Klasse. Für eine Datei mit 2MB XML-Code muss man auf einer 1GHz Maschine mind. 30sec warten.
        Das ist doch etwas zu lange.
        Für kleine Dateien ist man damit aber weitaus besser bedient als mit expat.

        Kommentar


        • #5
          Re: Danke...

          Zitat von Joschy
          Der nachteil ist aber die Geschwindigkeit der Klasse. Für eine Datei mit 2MB XML-Code muss man auf einer 1GHz Maschine mind. 30sec warten. Das ist doch etwas zu lange.
          Mein Tip: Shellscript (PHP gibt es ab 4.3.0 auch als CLI) via Cron. Es muß nicht immer alles Online sein...

          Kommentar


          • #6
            wenn du immer die gleiche anzahl an spalten hast in nem produkt
            dann könntest du es auch hiermit machen.

            Code:
            <?php
            $string = `grep -b10 '<Bauteil ID="SIC22323">' test.xml`;
            echo $string;
            ?>
            nachteil, sobald du ne spalte hinzufügst oder ne zeile hinzukommt läufts nicht mehr korrekt

            am besten ist es natürlich und auch performanter, wenne die daten inne mysql db reinpumpst und dann suchst

            Kommentar

            Lädt...
            X