B. Hopf: Fatal error: Allowed memory size of 12582912 bytes......

Hallo miteinander!

Habe da ein Problem mit PHP.

Folgende Meldung erscheint:
Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to
allocate 8192 bytes) in .....

Dies geschieht bei folgendem Aufruf: $imagefunc="imagejpeg";

Gut, memory_limit ist auf 12M eingestellt.

Ich möchte auf dem Server Bilder manipulieren, also verkleinern und komprimieren.
Meine Fragen: Wieso braucht eine Grafik(JPEG) mit einer Größe von ca. 800kb Speicherkapazität von ca. 12,6 MB? Gibt es dafür eine Musterrechnung?
Ich habe mit unset() einige Varibalen nicht mehr zu gebrauchende Variablen zerstört, was kann man noch tun?

Danke

B. Hopf

  1. Hallo miteinander!

    Habe da ein Problem mit PHP.

    Folgende Meldung erscheint:
    Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to
    allocate 8192 bytes) in .....

    ich hatte letztens ein ähnliches problem...bei mir lag letzten endes der fehler darin, dass ich ein array mit in einer endlosschleife zugemüllt habe

  2. Gibt es vielleicht einen Garbarge Collector, den man aufrufen könnte?
    Kann man den Speicher irgendwie frei machen? Bei mir habe ich soviele Scripte, daß ich unmöglich entdecken kann, wo mir was meinen Speicher füllt.

    1. Moin,

      Gibt es vielleicht einen Garbarge Collector, den man aufrufen könnte?

      Nicht so wirklich.

      Hast Du persistente DB-Verbindungen? Das ist wohl das einzige was nicht automtisch freigegeben wird, da musst dann mit free_result ran.

      Sonst bleiben noch unset. Evtl. mit touch() den Zugriff prüfen und wenn  nicht benötigt frei machen.

      Da es aber bei dir um Bildbearbeitung geht, denke immer drann, dass eine Kopie des Bildes zusätzlich im Speicher liegt.

      Stefan

      1. Moin!

        persistente DB-Verbindungen? Das ist wohl das einzige was nicht automtisch freigegeben wird, da musst dann mit free_result ran.

        Alles andere ist mit Ende des Scriptes weg. Müßte doch so sein, ja?
        Also mit memory_get_usage() habe ich mir wie wild jetzt die Speicherbelegung ausgeben lassen.
        Ich checke ganz unten auf einer Seite (letzte Zeile) und es werden 3,irgendwas MB belegt. Dann klicke ich auf einen Link auf der Seite (mit dem Link werden keine Variablen übergeben) und auf der dann aufgerufenen Seite wende ich ganz oben (vor allem anderen) wieder memory_get_usage() an.
        Da keine neuen Variablen dazu kamen, müßte doch immer noch der gleiche Platz an Speicher belegt sein, oder?
        Auf einmal sind bei mir aber plötzlich 8 MB belegt. Wie kann das sein?
        Ich habe mir alle Variablen auflisten lassen, um zu sehen, was denn den Platz belegen könnte. Da ist aber scheinbar nichts mehr bis auf die vom Server gesetzten Variablen und $_POST, $_GET, ...
        Was verbraucht denn noch Speicher? einfache Variablen, Arrays, offene Datenbankverbindungen. Gut. Was ist mit Funktionen? Die sollten keinen Speicher verbrauchen, wenn Sie nicht aufgerufen werden, ja?
        Hat jemand einen Tip, wie ich rausfinden kann, was den Speicher füllt, damit ich das gezielt freigeben kann?
        Ich weiß leider nicht mehr weiter.

        Gruß, Robert

  3. Moin!

    Meine Fragen: Wieso braucht eine Grafik(JPEG) mit einer Größe von ca. 800kb Speicherkapazität von ca. 12,6 MB? Gibt es dafür eine Musterrechnung?

    Wieso braucht ein JPEG des Hubble-Teleskops von der Sombrero-Galaxie, welches selbst nur 7,2 MB groß ist, zum Anzeigen über 200 MB RAM?

    Logisch, weil JPEG ein komprimiertes Format ist (mit den richtigen Bildinhalten oder Kompressionsfaktoren ist einiges möglich), die gdlib aber immer mit unkomprimierten Bilddaten arbeitet.

    Ergo: Anzahl der Pixel in X * Anzahl der Pixel in Y * 3 (Byte pro Pixel) = Speicherbedarf in Byte für das Bild

    Soll heißen: bei 12 MB RAM kannst du je 4 MB pro RGB-Farbe benutzen, und eine Bildauflösung von 2048*2048 haben (weil 2048*2048*3=12 MB).

    Wenn du _zwei_ Bilder im Speicher haben mußt, weil du aus einer Quelle in ein Ziel kopierst, verändert sich der verfügbare Speicher natürlich zuungunsten der Quelle.

    - Sven Rautenberg