![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Ich mache ein paar Aktionen mit Fotos (drehen, Helligkeit, etc.) wenn ich nun ein Foto (was ein Dau hochlädt) mit an die 2000px drehe bekomme ich wie zu erwarten einen memory allocation error, eben das zu wenig Speicher vorhanden ist. Ich würde diese Fatal Error der beispielsweise bei imagerotate() auftreten kann abfangen. Leider hab ich schon einiges Versucht. Das Script bricht einfach ab. Auch mit @imagerotate bekomme ich nichts zurückgeliefert. Am liebsten wär mir ein false (wenn der speicher nicht reicht) um damit eine exception zu werfen. Hat jemand eine Idee wie ich aus diesem FatalError eine Exception bekomme oder irgendwas anderes brauchbares statt einer leeren Seite? |
| | |
| | Nach oben #3 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
Wieviel Speicher verbraucht wird sollte sich in etwa doch errechnen lassen, oder? Dazu auch: wie groß ein Bild ist kann man ja mittels getimagesize ermitteln. Somit auch den Speicherberbrauch, oder?
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #4 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Den benötigten Speicher zu berechnen, dachte ich auch schon allerdings war mir nich ganz klar wie das geht. Wie berechne ich vorher den Speicherverbrauch? Eignet sich hierfür das Grundlagen Tutorial? Ich müsste das doch noch mit dem normalen Speicherverbrauch verrechnen oder? Übrigens ist mir zum Beispiel aufgefallen das nicht unbedingt die Dateigröße entscheidend ist sondern auch die Bildmaße. So hat ein Bild mit 800kb und ca 2500*2000 Pixel einen Fatal Error erzeugt aber ein kleineres Bild mit größerer Dateigröße nicht. |
| | |
| | Nach oben #5 | |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
| Zitat:
ja!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! | |
| | |
| | Nach oben #7 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Ich hab im Web mal die gleiche Fehlermeldung aufgeschnappt Code: Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 12 bytes) Zu dem Fatal Error: Wieviel Speicher braucht den dieser Befehl der den Fatal Error erzeugt hat? 16777216 Bytes + 12 Bytes? Oder was bedeutet denn "tried to allocate..."? |
| | |
| | Nach oben #8 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Die Seite ist noch nicht schön, aber: http://www.mediacix.de/code/GDlib-un...f-85-code.html Mit memory_get_usage() kannst du das sogar live auslesen. Natürlich kann man auch im Vorfeld das ganze grob berechnen. MB = 2500 * 2000 * 40 ----------------- 8 * 1024 * 1024 Laut Fehlermeldung stehen nur 16MB (memory_limit) bereit, dein Bild braucht aber über 23MB und weil dies etwas mehr ist, kommt es zur Fehlermeldung. Also der Versuch mehr als 16MB zu benutzen |
| | |
| | Nach oben #9 | |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Wie ich geschrieben habe ist die Meldung aus dem Web und nicht von mir. Auf meinem localhost ist die Meldung genauso formuliert nur die Werte sind anders. Ok. Ich denke mit den Infos aus dem Thread werd ich mal ne Funktion bauen die den Speicher berechnet, wenn ich was aufgesetzt habe werde ich es hier mal posten. EDIT: Hier ist nun meine Fehlermeldung. Bilddatei ist 2600*1200px groß und hat eine Dateigröße von 260,5 kb. Ich mache imagerotate um 2 Grad und dann kommt das: Zitat:
Geändert von ex³ (04.01.2008 um 21:55 Uhr). | |
| | |
| | Nach oben #10 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Ansonsten wurde ich einfach mal von der kleinstmöglichen Größe ausgehen und von dort an die Speicher-Grenze erhöhen, bis es passt. Mindestens brauchst du ja den momentan schon benutzten Speicher (memory_get_usage()), dazu den Bedarf für das „ausgepackte“ Original (also w * h + Farbtiefe) und den Bedarf für das Ergebnis. Hier musst du die Dimensionen eben anhand des Winkels der Drehung ausrechnen. Da noch ein bisschen Puffer für die Berechnung sollte wahrscheinlich reichen. Basti Geändert von Basti (07.01.2008 um 02:29 Uhr). | |
| | |
| | Nach oben #11 |
| Erfahrener Benutzer Registriert seit: 31.12.2006 Ort: Zürich
Beiträge: 298
|
Einfach mal die Seite von Jann Hendrik beachten! Da wird das ganz geuna beschrieben. Es steht sogar, wie du die Grösse berechnen kannst...
__________________ . <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
| | |
| | Nach oben #12 | |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
| Zitat:
Denn die Verarbeitungsschritte verbrauchen ja auch noch was!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! | |
| | |
| | Nach oben #13 |
| Erfahrener Benutzer Registriert seit: 31.12.2006 Ort: Zürich
Beiträge: 298
| Das findet man vermutlich am besten mit Versuchen heraus: Ich behaupte einfach mal, dass das prozentmässig immer ungefähr gleich viel ist
__________________ . <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
| | |
| | Nach oben #14 | |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
| Zitat:
ImageRotate erzeugt innerhalb der GDlib ein neues TrueColor-Bild (gdImageTrueColor). Dabei wird von jedem Pixel R, G, B (als TrueColor) und Alpha vom Originalbild erfasst, die neue Postion berechnet und in das neue erzeugte Bild geschrieben. Man kann also davaon ausgehen, dass sich der Speicherbedarf mind. verdoppelt, weil sich in diesem Moment praktisch 2 Bilder im Speicher befinden. Jedenfalls solange bis der Bearbeitungsprozess beendet ist. Hier hab ich mal versucht eine eigene Rotate-Funktion zu schreiben: http://www.mediacix.de/code/demo.php5?id=165 Im Prinzip kommt das selbe raus, und der Speicherbedarf wird sogar noch größer, weil durch die Drehung das Bild in der Breite und Höhe auch größer wird. Jedenfalls größer als wenn das Bild nur um 90° gedreht wäre. Geändert von CIX88 (05.01.2008 um 02:08 Uhr). | |
| | |
| | Nach oben #15 | |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
| Zitat:
Hat sich also erledigt. Für mich lohnt sich der Aufwand nicht so eine Vorausberechnung zu machen. | |
| | |
| | Nach oben #16 | |
| Neuer Benutzer Registriert seit: 14.10.2006
Beiträge: 3
|
[quote=ex³;58996] Zitat:
| |
| | |
| | Nach oben #18 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Unten ein Code zum Rumspielen und eine Beispielausgabe. Er enthält u.A. eine Berechnung der neuen Bild-Maße (oh man, Geometrie-Unterricht ist lange her, aber scheint zu stimmen Was mich wundert, ist, dass die Bilder einiges mehr als das 4-fache (TrueColor + Alphakanal = 32 bit = 4 Byte) ihrer Breite * Höhe an Bytes benötigen. Ich hab den Faktor 5,6 gewählt. Er lag tatsächlich manchmal über 5,5. Die so errechneten Werte der beiden Bilder hab ich dann zusammen mit 1,7 multipliziert und damit bei meinen Tests immer im grünen Bereich geblieben. Aber vielleicht hab ihr bessere Werte, eine passendere Berechnung oder findet einen Fehler. Basti Drehungen um 90, 180 etc. Grad sind hier (noch) nicht berücksichtigt. Sie benötigen wesentlich weniger Speicher. PHP-Code: Code: dims original 900 * 500
angle 45
image mem factor 5.6
rotation factor 1.7
memory limit 14,680,064
expected total mem 13,876,696
expected result okay
mem used by original 2,269,400
expected 2,520,000
mem used by rotated 4,933,576
expected 5,488,560
mem usage total 12,759,136
expected 13,876,696
dims expected 990 * 990
real dims 990 * 990
Geändert von Basti (10.01.2008 um 21:22 Uhr). |
| | |
| | Nach oben #19 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Ich bin der Meinung - bevor man sich mit soetwas auseinandersetzen muss (Speicherknappheit im Script) - dass ein Script, welches Bilddaten verarbeiten soll ruhig genug Speicher zur Verfügung haben soll. Ich habe meinen Cron-Jobs meist 256 oder 512 MB zugestanden, damit eben das nicht passiert, was hier beschrieben wird!?
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #20 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
| Was aber heißt, dass man Zugriff auf die php.ini haben muss, was nicht jeder haben dürfte! Oder lässt sich das als .httaccess-Direktive ändern?
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|