Allowed memory size exhausted - Frage zu den Werten
Hübi
- php
0 Hübi0 dedlfix0 Felix Riesterer
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 30356350 bytes) in Unknown on line 0
Hi, diese Nachricht bekomme ich, wenn ich zwei Vektoren multiplizieren möchte. Zugegeben, es sind Zeitreihen mit Klimadaten. Die Meldung ist also nicht ganz abwegig.
Die Frage ist nun, warum hat er beim Versuch 29MB zu allozieren das Problem die 128MB Grenze zu überlaufen? Ist soviel anderes im Speicher?
Falls ja, kann man den Speicher leeren vor der Aktion, sodass die vollen 128MB zur Verfügung stehen? Kann man sich ansehen, durch was der Speicher benötigt wird?
Fragen über Fragen :)
Bin dankbar, wenn jemand Licht ins Dunkel bringt!
Grüße, Hübi
PS: es geht nicht darum, den Wert mittels memory_limit in der php.ini hochzusetzen!!
Hi!
Die Frage ist nun, warum hat er beim Versuch 29MB zu allozieren das Problem die 128MB Grenze zu überlaufen? Ist soviel anderes im Speicher?
Ja.
Falls ja, kann man den Speicher leeren vor der Aktion, sodass die vollen 128MB zur Verfügung stehen?
Jein. Ganz leer geht nicht, und explizit leeren geht auch nicht. Du kannst nur Variablen löschen (unset()) und andere Ressourcenverbraucher freigeben.
Kann man sich ansehen, durch was der Speicher benötigt wird?
Nein, nur wieviel belegt ist. Eine entsprechende Funktion findest du im Handbuch im selben Kapitel wie phpinfo(). Da sie nicht mehr als diesen Wert liefert, ist sie mir so unnütz, dass ich mir ihren Namen nicht gemerkt habe.
Lo!
Lieber Hübi,
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 30356350 bytes) in Unknown on line 0
mit diesem Problem hatte ich neulich auch zu kämpfen - um am Ende festzustellen, dass mein eigentliches Problem "ein blödes B" gewesen war.
die 128MB Grenze zu überlaufen? Ist soviel anderes im Speicher?
Wenn Du explizit den Wert "128MB" eingestellt hast, dann missversteht PHP diesen Wert und richtet Dir _keine_ 128MB ein, sondern nur einige Kilobyte! Der Wert muss exakt "128M" lauten (ohne "das blöde B")!
Und je nach Anwendungsfall kann es durchaus sein, dass PHP im Hintergrund viel Speicher allozieren will, besonders dann, wenn Du Grafikdaten oder umfangreiche Datenbank-Ergebnisse bearbeiten willst.
Liebe Grüße,
Felix Riesterer.
Moin!
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 30356350 bytes) in Unknown on line 0
mit diesem Problem hatte ich neulich auch zu kämpfen - um am Ende festzustellen, dass mein eigentliches Problem "ein blödes B" gewesen war.
Wenn du das Memory-Limit auf "128MB" festsetzt, und daraus wenige Kilobyte gemacht würden, würde bei "allowed memory size of '134 Million' bytes" nicht 134 Millionen Bytes erwähnt werden, sondern die paar tausend Bytes.
die 128MB Grenze zu überlaufen? Ist soviel anderes im Speicher?
Wenn Du explizit den Wert "128MB" eingestellt hast, dann missversteht PHP diesen Wert und richtet Dir _keine_ 128MB ein, sondern nur einige Kilobyte! Der Wert muss exakt "128M" lauten (ohne "das blöde B")!
Und je nach Anwendungsfall kann es durchaus sein, dass PHP im Hintergrund viel Speicher allozieren will, besonders dann, wenn Du Grafikdaten oder umfangreiche Datenbank-Ergebnisse bearbeiten willst.
Man darf davon ausgehen, dass PHP alle Variablen und außerdem eingebundene Ressourcen im Speicher hält. Wenn man in Speicherknappheit gerät, gibts nur zwei Auswege: Entweder das Speicherlimit hochsetzen (das ist recht einfach machbar, löst aber unter Umständen die Ursache des Problems nicht), oder den Code durchgehen und explizit das Säubern überflüssiger Variablen und das Freigeben nicht mehr benötigter Ressourcen hineinzuprogrammieren.
Und ggf. auch das korrekte manuelle Auflösen zirkulärer Referenzen in Objekten! Wobei PHP 5.3 in diesem Punkt auch mit seiner internen Garbage-Collection endlich aufräumen kann, die Versionen davor können das noch nicht.
- Sven Rautenberg
Lieber Sven Rautenberg,
was soll ich sagen? Unter PHP5.3win32 hatte ich mit set_memory_limit('128MB')
Schiffbruch erlitten. Mit set_memory_limit('128M')
hatte ich den benötigten Speicher plötzlich zur Verfügung. Warum das so ist, bringt mich momentan nicht wirklich weiter. Ich wende es an und kümmere mich um andere Problemstellungen.
Man darf davon ausgehen, dass PHP alle Variablen und außerdem eingebundene Ressourcen im Speicher hält. Wenn man in Speicherknappheit gerät, gibts nur zwei Auswege: Entweder das Speicherlimit hochsetzen (das ist recht einfach machbar, löst aber unter Umständen die Ursache des Problems nicht), oder den Code durchgehen und explizit das Säubern überflüssiger Variablen und das Freigeben nicht mehr benötigter Ressourcen hineinzuprogrammieren.
Da stimme ich Dir voll und ganz zu. Je nach Anwendungsfall und Systemumgebung mag aber einmal das erstere, und ein anderes Mal das zweitere die vernünftigere Lösung sein.
Liebe Grüße,
Felix Riesterer.