allowed memory error trotz 1024MB RAM

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

  • allowed memory error trotz 1024MB RAM

    Hallo allerseits,

    habe da ein Problem mit einem Parsingskript, das XML Dateien auslesen soll und externe Bilder kleinrechnen soll. Jetzt ist das ganze so programmiert, dass bei riesigen XML Dateien das Skript nach 50 Datensätzen sich neu lädt, in einer foreach Schleife dann wieder den Anschluss in der XML Datei sucht und weiter macht usw. . Dabei werden die Daten immer in die DB geschrieben und zugehörige Bilder kleingerechnet.

    Das Problem:

    Das Skript hat ein riesen XML-Skript zu bewältigen mit 800 Datensätzen samt bildern, er lädt alle 50 Datensätze neu und sucht den Anschluss. Zu große Bilder werden übergangen. Ziemlich genau bei der Hälfte bleibt er hängen und zeigt:

    Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 5168 bytes)

    Habe aber einen Server mit 1024 MB Arbeitsspeicher!
    Noch dazu wird das Skript alle 50 Datensätze neu geladen.
    Es kann auch keinen Laufzeiterror geben (der ist auf 10Min. eingestellt).

    Die Frage:

    Woran kann das liegen? Scheinbar überlastet ihn die foreach schleife, die eventuell einige hundert male durchlaufen wird, bis der Anschlussdatensatz gefunden wird:

    foreach($xml2->anbieter->immobilie as $immo){
    $datei_zaehler = $datei_zaehler +1 ;
    if(!$datensatz_zaehler){ $datensatz_zaehler = 1; }
    if($durchgang_zaehler == 51){
    echo "<script language ='JavaScript'>location.href='parsing_neuladen.php5?datensatz_zaehler=$datensatz_zaehler';</script>"; }else{}
    }

    Kann so eine Schleife zu diesem Abbruch führen? Was kann ich tun, um rauszufinden, warum das abbricht?

    Danke für jede Hilfe,
    Michael

  • #2
    Habe aber einen Server mit 1024 MB Arbeitsspeicher!
    Und wenn du 160 TByte hättest würde es keinen Unterschied machen, solange du php nicht das Recht gibst eine entsprechende Menge Speicher in Beschlag zu nehmen.
    Momentan scheinst du als Limit 12 MByte zu haben. Mal die php.ini öffnen und den entsprechenden Wert ändern, speichern und Apache neustarten.

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Doch das ist der PHP RAM

      Doch, dieser Arbeitsspeicher ist für PHP Anwendungen:

      php_admin_value memory_limit 1024M ! Oder?

      Kommentar


      • #4
        wohl eher so:

        memory_limit = 16M ; Maximum amount of memory a script may consume (16MB)

        bzw. 1024M

        danach den serverdienst durchstarten.
        tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
        documentation: php.net mysql.com framework.zend.com

        Die Nachtwache!

        Kommentar


        • #5
          Nochwas

          Nochwas: Hab auch versucht riesen Bilder mit 2 MB hochzuladen und kleinzurechnen und as funktioniert! Also der Arbeitsspeicher an sich greift schon!

          Kommentar


          • #6
            Da steht
            Allowed memory size of 12582912 bytes exhausted
            und das sind 12 MB.
            Ändere die Einstellung, php_info() zur Kontrolle, und gut ist.

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

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

            Kommentar


            • #7
              php_admin_value?! in der php.ini? geht das? nein! diese deklaration wird in der httpd.conf oder htaccess verwendet.

              tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
              documentation: php.net mysql.com framework.zend.com

              Die Nachtwache!

              Kommentar


              • #8
                Wie groß die Bilddateien sind, mit denen du es probiert hast, ist völlig egal. GD (ich gehe davon aus, dass du GD verwendest) dekomprimiert die Bilder beim öffnen. Und im RAM speichert es sie dann mit 8 Bit pro Kanal. Bei 3 Kanälen (Rot, Grün, Blau) ergibt das 3 Byte pro Pixel. Den Arbeitsspeicherbedarf eines Bildes kannst du also ausrechnen:

                Breite des Bildes (in Pixeln) * Höhe des Bildes (in Pixeln) * 3 Byte

                Und wenn das für ein Bild mehr als 12 MB wird, bricht dein Script ab. Allerdings hilft auch die brave Anwendung von image_destroy und ein bisschen Glück.
                hopka.net!

                Kommentar


                • #9
                  Lösung

                  Hallo Allerseits,

                  danke, hab jetzt die Lösung:

                  also irgendwas ist da mit dem Script komisch. Das Script wird aus mir unbekannten Gründen anhand des MasterValues bewertet und nicht anhand des LocalValues in Bezug zu dem memory_limit.

                  Ich habe nun mal direkt in der php.ini das memory_limit auf 512M gestellt und siehe es läuft und läuft und läuft, danke an alle...

                  Michael

                  Kommentar


                  • #10
                    Breite des Bildes (in Pixeln) * Höhe des Bildes (in Pixeln) * 3 Byte
                    Nein, meines bescheidenen Wissenes nach, sind es 4Byte pro Pixel, du hast den Alpha Kanal vergessen...
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      das kommt alles auf das format an, aber das ist nicht das thema.

                      Kommentar

                      Lädt...
                      X