Allowed memory size exhausted

In letzter Zeit lese ich es in Foren öfter, wenn es um WordPress (nicht nur) und Bildupload geht :

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 14592 bytes) in /…

wobei die erste Zahl auch mal 33554432 (Billighoster, nä) oder gar 16777216 (free oder gaaanz billig) lauten kann und die zweite Zahl von Aufruf zu Aufruf Schwankungen unterliegt.

Volkstümlich übersetzt „hier kummst du net rein“ oder präziser gesagt: Dein Bild ist zu groß um von deiner Webanwendung weiterverarbeitet zu werden. Es hat also nichts mit dem Upload zu tun, sondern mit dem was deine Webapplikation mit dem Bild danach macht, WordPress generiert z.B. alle im Mediamanager eingestellten Formate und die meisten Galerien erzeugen mindestens ein Thumbnail und ein Anzeigengröße. Für all das wird Speicher benötigt, nicht billiger Plattensplatz, sondern RAM, der flüchtige Hauptspeicher des Servers in dem alle Prozesse ablaufen. Mit dem Plattenplatz wird gerne geworben, aber hinsichtlich des zur Verfügung stehenden RAMs halten sich manche Anbieter in ihrer Werbung bedeckt.

Zahlen wie 67108864, 33554432 oder 16777216 bedeuten näherungsweise nichts anderes als 64, 32 oder 16 Megabyte Hauptspeicher und je mehr Kunden ein Hoster auf einem Server unterbringt, desto mehr Geld kann er zwar verdienen, aber um so weniger Arbeitsspeicher und Ausführungszeit kann dem Einzelnen zugewiesen werden. Die aktuelle 3er Version von WordPress benötigt inzwischen schon mindestens 18 MB, was für einige Freehoster und Billigprovider ein ziemlicher Schlag war, sie mußten auf 24 oder 32MB pro Account aufstocken, da ihnen sonst die Kunden wegliefen. Nebenbei erwähnt, es gibt auch Freehoster die von Haus aus 64MB anbieten.

WordPress V.3.x ist ein Ressourcenfresser, mit ein paar wenigen Plugins ist man ganz schnell über der 20MB Marke. Vorerst kein Problem, aber wenn man sich dann noch Themen wie Suffussion oder Atahualpa und den Flugzeugträger unter den WordPress Galleriescripten „nextgen“ zulegt, schrubbt man schon an der 30MB Marke und dann wird es bei 32MB schon recht eng, wenn man auch nur ein Briefmarkengrosses Bild einbinden möchte. Aber im weiteren gehe ich mal davon aus, daß die Mehrheit 64MB hat, von denen mindestens die Hälfte für die Bildverarbeitung zur Verfügung stehen.

Wow, 32 MB, dabei hat mein Bild doch nur 3MB. Typischer Gedankenfehler. Die 3MB, die das Bild als Dateigröße im Dateimanager anzeigt hat nichts, aber rein gar nichts damit zu tun, wie viel Speicher ich zur Verarbeitung benötige, da zählt die Anzahl der Pixel und die Farbtiefe. Eine Ahnung wohin das gehen kann zeigt ein Vergleich zwischen den JPGs einer Kamera mit (unkomprimierten) TIFFs aus der selben Kamera. Die Größe der JPGs kann zwischen 1-8MB schwanken, abhängig vom eingestellten JPG Kompressionsgrad und den Aufnahmeumständen, während die TIFFs immer ca 21MB haben (Sony R1, 10MP Kamera). Nun sind 21MB bei einer 10MB Kamera leider nicht das Ende der Rennbahn, Bildprogramme arbeiten in der Regel mit 24Bit Farbtiefe und da kommt man bei einer Sony R1 (bzw. generell bei jeder 10MP Kamera) auf fast 29MB. Wer selber rechnen möchte: Breite x Höhe X Farbtiefe (3*8 Bit bei RGB=24). Da das Ergebnis eine ziemlich große unhandliche Zahl von BITs ergeben, rechnen wir das einfach in Bytes um /8, das Ergebnis durch 1024=Kilobyte, nochmal durch 1024 und wir haben die Megabytes.

Warum streikt mein WordPress dann aber trotzdem, wenn ich mal ein Sony R1 Original hochladen möchte, es steigt ja sogar schon bei Originalen meiner 20D aus und das ist nur eine 8MP Kamera, nach obiger Rechnung sind das nur 23,5MB. Dumm gelaufen, fast alle Webapplikationen benutzen die sogenannte PHP-GDLib und die arbeitet nicht mit 24 Bit, sondern mit 40 Bit. Grund dafür dürfte sein, daß GDLib auch CMYK Bilder (32 Bit) mit Alphakanal (8 Bit) verarbeiten kann. Das verändert das Ergebniss dramatisch, da komme ich für eine 8MP Kamera auf 39MB (was erklärt, warum ich auf meiner alten WordPress 2.0 mit nur wenigen Plugins noch keine Probleme hatte) und für eine 10MP Kamera schon auf 48MB. Mit den 12MP Bildern meiner 5D komme ich dann auf satte 60,5MB was dann die Obergrenze darstellt, was mit 64MB RAM noch zu verarbeiten ist (natürlich nicht mehr mit WordPress oder einem leistungsfähigeren Galeriescript, da muss dann schon was „schlankeres“ dran).

Wie lässt sich das Problem lösen? Nun, wenn man keine originalgroßen Bilder in WordPress zeigen möchte, dann verkleinert man sie einfach vor dem Upload auf die maximale Anzeigegröße die man vorgesehen hat, das dürfte selten über die Anzeigengröße eines HD Full Formates, also grob gesprochen 2000*1000px, raus gehen. Da liegen wir bei 6MB, wenn man keine zu überladene WordPress Installation hat, lüppt das auch noch auf 32MB Ram. Wenn man dann doch mal Bedarf für ein Original hat, regelt man das über eine externe Bildverlinkung. Die teure Lösung wäre ein Hostingpaket dass 128MB Ram anbietet, das dürfte bei den meisten Anbieter aber auf sogenannte VServer rauslaufen, mit denen der normale Anwender („ich bin doch nur bloggender Fotograf und will nicht zum Server Admin mutieren!“) als Einsteiger aber heftigst überfordert sein dürfte.