dey: oder server: Allowed memory size exhausted

Hallo,

ich parse eine XML-Datei der Grösse 136kb mit minixml und es taucht folgende Fehlermeldung auf:
Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 35 bytes) in /windows/d_on_lap-dey/Eigene/html/ahzwei/engine/minixml/classes/doc.inc.php on line 601

Ursprünglich war der Wert in php.ini auf 8M gesetzt. Ich habe jetzt einige Werte gestestet. bei 20M lief es.
Ich ging jetzt davon aus, dass bei obiger Fehlermeldung ein Wert von 13M reicht... Pustekuchen:
Fatal error: Allowed memory size of 13631488 bytes exhausted (tried to allocate 61366 bytes) in /windows/d_on_lap-dey/Eigene/html/ahzwei/engine/minixml/classes/doc.inc.php on line 601
Ich verstehe jetzt den Zusammenhang zur Meldung gar nicht mehr!

DEr code in Zeile 601:
if (preg_match_all(  $regex, $XMLString, $matches))

Kann es jemand erklären?

bydey

--
-- bydey ist die Signatur und Verabschiedung, nicht der Nick --
-- Navigate all your PHP web projects with  PHP Project Browser--
  1. hi,

    Ich ging jetzt davon aus, dass bei obiger Fehlermeldung ein Wert von 13M reicht... Pustekuchen:
    Fatal error: Allowed memory size of 13631488 bytes exhausted (tried to allocate 61366 bytes) in /windows/d_on_lap-dey/Eigene/html/ahzwei/engine/minixml/classes/doc.inc.php on line 601
    Ich verstehe jetzt den Zusammenhang zur Meldung gar nicht mehr!

    Der Fehler kommt in dem Augenblick, wo dein Script mal wieder zusätzlichen Speicher anfordert, aber keinen mehr zugestanden bekommt.

    Erst waren 12 MB überschritten, also kommt Mecker, wenn dein Script noch mehr anfordert.

    Jetzt stellst du 13 MB ein, gut. Dein Script ist am gleichen Punkt wie vorher, 12 MB braucht es aktuell, es fordert noch ein bisschen mehr an, geht gut, es fordert noch ein bisschen mehr an, geht gut - und dann irgendwann ist die Grenze von 13 MB erreicht, knallt wieder.

    Dein Script steigt dann aus, wenn es sich aktuell noch ein bisschen mehr Speicher holen möchte, als es darf. Daraus kannst du aber absolut keinen Rückschluss ziehen, wie viel dein Script maximal zum Zeitpunkt x benötigt hätte, um seine Aufgabe erfüllen zu können.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Dein Script steigt dann aus, wenn es sich aktuell noch ein bisschen mehr Speicher holen möchte, als es darf. Daraus kannst du aber absolut keinen Rückschluss ziehen, wie viel dein Script maximal zum Zeitpunkt x benötigt hätte, um seine Aufgabe erfüllen zu können.

      Kann ich das rausbekommen?

      bydey

      --
      -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
      -- Navigate all your PHP web projects with  PHP Project Browser--
      1. echo $begrüßung;

        Dein Script steigt dann aus, wenn es sich aktuell noch ein bisschen mehr Speicher holen möchte, als es darf. Daraus kannst du aber absolut keinen Rückschluss ziehen, wie viel dein Script maximal zum Zeitpunkt x benötigt hätte, um seine Aufgabe erfüllen zu können.
        Kann ich das rausbekommen?

        Mit memory_get_peak_usage() sollte das zu ermitteln sein.

        echo "$verabschiedung $name";

        1. Hallo,

          Mit memory_get_peak_usage() sollte das zu ermitteln sein.

          Schade, eher nein:
          Fatal error: Call to undefined function memory_get_peak_usage() in /windows/d_on_lap-dey/Eigene/html/phptest/memory_check.php on line 15

          bydey

          --
          -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
          -- Navigate all your PHP web projects with  PHP Project Browser--
          1. echo $begrüßung;

            Mit memory_get_peak_usage() sollte das zu ermitteln sein.
            Schade, eher nein:
            Fatal error: Call to undefined function memory_get_peak_usage() in /windows/d_on_lap-dey/Eigene/html/phptest/memory_check.php on line 15

            Aha, dann ist das eine Leiche oder ein Fötus im Handbuch: "no version information, might be only in CVS". In dem Fall gäbs noch memory_get_usage(), wobei du da ziemlich zeitnah messen musst. Inwieweit das dann aber trotzdem neben der Spitze liegt, kann ich mangels Erfahrung nicht sagen.

            echo "$verabschiedung $name";

            1. Hallo,

              Aha, dann ist das eine Leiche oder ein Fötus im Handbuch: "no version information, might be only in CVS".

              5.x und 4.4.4 funktionieren schon mal nicht!

              In dem Fall gäbs noch memory_get_usage(), wobei du da ziemlich zeitnah messen musst. Inwieweit das dann aber trotzdem neben der Spitze liegt, kann ich mangels Erfahrung nicht sagen.

              Da ist ja der Haken, denn ich weiss ja im Moment nur von dem einen Problemfall. Die anderen "versteckten" kann so nicht hinbekommen, da ich ja nicht weiss, wo ich das memory_get_usage() plazieren muss.

              bydey

              --
              -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
              -- Navigate all your PHP web projects with  PHP Project Browser--
              1. Moin!

                Aha, dann ist das eine Leiche oder ein Fötus im Handbuch: "no version information, might be only in CVS".
                5.x und 4.4.4 funktionieren schon mal nicht!

                Nur, wenn PHP mit der richtigen Option kompiliert wurde.

                Wobei: get_memory_peak_usage() hilft dir nicht unbedingt. Dazu müßte das Skript einmal funktionierend durchlaufen.

                Und das Resultat wäre nur bei einer konkreten XML-Datei anwendbar. Nimmst du eine andere Datei, wird sich der Speicherbedarf ändern.

                Arrays und Objekte nehmen bei PHP relativ viel Speicher ein - jedenfalls im Vergleich zur Erwartung, die man vielleicht hat. Dagegen hilft nur, entweder die Menge an erlaubtem Speicher hochzudrehen, oder den Speicher nicht mehr als erlaubt zu nutzen, also beständig get_memory_usage() und die INI-Einstellung für den maximalen Speicher zu vergleichen.

                Wobei letzteres kaum eine gute Lösung sein dürfte, weil man dann das Problem ggf. nicht lösen kann. Man könnte höchstens sauberer aussteigen.

                Da ist ja der Haken, denn ich weiss ja im Moment nur von dem einen Problemfall. Die anderen "versteckten" kann so nicht hinbekommen, da ich ja nicht weiss, wo ich das memory_get_usage() plazieren muss.

                Du kannst zu jeder Zeit die verbrauchte Speichermenge ermitteln. Das Maximum deiner Messwerte ist dann die mindestens benötigte Speichermenge.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."