Extrem (Ressourcen) aufwendiger Prozess

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

  • Extrem (Ressourcen) aufwendiger Prozess

    Hallo,
    ich arbeite derzeit an einem Projekt für unsere Schulbücherei. Leider gibt es da ein Problem.

    Am besten ich beschreibe erstmal das komplette Projekt:

    1. Ein auf Visual Basic basierendes Programm konvertiert eine Access-Datenbank in XML.

    2. Das XML-File wird per FTP auf den Webserver geladen

    3. Der Webserver soll alle XML-Einträge mit der MySQL-Datenbank abgleichen.

    Das funktioniert auch alles so weit

    Mein Problem ist jetzt, dass die XML-Datei 159.914 Zeilen hat. Tendenz steigend. (Das sind ca. 5,6 MB)

    Wenn ich diese Datei jetzt einfach so verarbeiten lasse, erhalte ich (natürlich) die Meldung, dass das Memory_Limit überschritten wurde. Also habe ich ne php.ini ins Directory gelegt memory_limit = 30M und max_execution_time = -1

    Daraufhin läd die Seite ca. 30sekunden und zeigt mir dann einen Internal Server Error an.

    Meine Fragen:

    1. Woran könnte das liegen (ich habe anscheinend keinen Zugriff auf den Errror-Log, Error_reporting ist ausreichend gesetzte -> Trozdem nur der 500er.)?

    2. Sollten noch andere Einträge an der php.ini geändert werden, sodass es funktionieren könne

    3. (FALLS NICHT Wie lasse ich php die Datei am schlausten zerlegen, sodass immer nur so viel von der XML-Datei geparst wird, wie der Server aushält.

    (Anmerkung: Ich habe den gleichen Vorgang zum Test mit einer XML-Datei mit ca. 100 Zeilen ausprobiert: Kein Problem)

    Danke im Vorraus


    Regards,
    Fabian Golle
    Micronax Systems

  • #2
    Ich glaube nicht, daß der Provider erlaubt, die Limits per php.ini zu verändern. Damit wäre der Sinn der Limitierung ja komplett hinfällig.

    Ohne error-Log keine Chance auf vernünftige Hilfe! Hoster fragen.

    Kommentar


    • #3
      Doch. Strato erlaubt das.. komischerweise.. Ich hab in der im Ordner angelegten php.ini das Memory_limit auf 60M gesetzt und es hat geklappt.

      Hoster wird angemailt.

      Thx

      Micronax

      Kommentar


      • #4
        Re: Extrem (Ressourcen) aufwendiger Prozess

        Original geschrieben von micronax
        3. Der Webserver soll alle XML-Einträge mit der MySQL-Datenbank abgleichen.
        beschreibe kurz, wie du das machst.

        Kommentar


        • #5
          Tja.. ehem..

          Der Server nimmt jeden der 15.000 XML-Enträgen und guckt, ob dieser bereits in der DB vorhanden ist, wenn ja -> keine Aktion, wenn nicht --> Eintragen

          (Ich weiß, nicht gerade die Ressourcensparende Methode, aber wie sonst?)

          Micronax
          Zuletzt geändert von ; 08.04.2007, 18:07.

          Kommentar


          • #6
            Der Server nimmt jeden der 15.000 XML-Enträgen ...
            und wie geht das?

            Kommentar


            • #7
              Ähm.?

              PHP-Code:
              $xml = new Xml;
              $out $xml->parse('../littera.xml');
              foreach(
              $out["buch"] as $buch) {



              Das ist eine XML-Klasse, die ich mit foreach durchlaufen lasse.

              Kommentar


              • #8
                und wie funktioniert diese klasse?

                Kommentar


                • #9
                  Die Klasse ist nicht von mir. Die, die ich geschrieben hab' war leider nicht funktionstüchtig...

                  Hab' den Quelltext mal hier gepostet

                  Sie öffnet die XML-Datei und geht Eintrag für EIntrag durch, ruft die sub-nodes ab, und liefert die in einem 2-diminsionellen Array wieder.

                  Micronax

                  Kommentar


                  • #10
                    Die Klasse ist nicht von mir.
                    kein grund es nicht zu wissen. deine klasse benutzt sax, und das wollte ich hören.

                    es ist tatsächlich falsch, die gesamte xml datei einzulesen, bevor man mit der auswertung beginnt, wenn man nicht mehrere datensätze gleichzeitig zur auswertung benötigt (bei dir wohl nicht der fall). mit sax kann man es viel effizienter auf beliebig großen dateien realisieren, und das mit minimalem speicherverbrauch.

                    informiere dich darüber und schreibe einen eigenen sax-handler, der mit vorgegebener speicherschranke alle zig-tausend xml einträge _nach einander_ einliest und verarbeitet.
                    OffTopic:
                    zu der bekannten "copy-paste-programmierung" kommt immer öfter die "ich-habs-aus-dem-internet-programmierung".

                    Kommentar


                    • #11
                      *grml*
                      Zuletzt geändert von ; 08.04.2007, 18:41.

                      Kommentar


                      • #12
                        -.-

                        Ich kapier das nicht. Ich habe jetzt 3 Stunden an diesem XML-Parser-Kram rumgehangen und es nicht hinbekommen. Kannst du oder jemand anderes sachkundiges mir nicht nochmal einen Tipp geben?

                        Micronax

                        Kommentar


                        • #13
                          Re: -.-

                          Die Contribute Notes klingen interessant, damit würd ich mich mal beschäftigen (ob es ne Lösung für dein Problem ist, weiß ich allerdings nicht)
                          http://de3.php.net/manual/de/ref.xml.php#38356



                          http://sourceforge.net/projects/saxy-xmlparser/

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            jedes mal wenn ein tag geöffnet wird und du feststellst, es ist ein neuer datensatz, schreibst du seinen inhalt und alle kinder in einen buffer. wird dieser tag geschlossen, weißt du - datensatz komplett, kann mit der db abgeglichen werden oder wasauchimmer. danach buffer löschen nicht vergessen. so wird dein speicher nie mehr als einen datensatz auf einmal halten müssen.

                            Kommentar


                            • #15
                              Soo.. genauso hab' ich's jetzt gemacht.. Und siehe da: Er machts...

                              Aber: leider nur ca. 3700 Einträge. Anschließend bricht er einfach so, ohne eine Fehlermeldung ab.

                              max_execution_time und memory_limit sind ausreichend eingestellt.

                              Kommentar

                              Lädt...
                              X