Memory exhausted

Hallo,

ich habe eine Fotogallerie auf meiner Seite flotografiert.bplaced.net und möchte dort meine Originalbilder (12MP) hochladen, die danach automatisch in verschiedene Größen verkleinert werden. Das Original wird daraufhin gelöscht.
Allerdings erhalte ich die Fehlermeldung:

Lässt sich da was umstellen?

Viele Grüße,
Florian

Ja: Lade bitte keine 12MP Bilder hoch.
Für die Berechnung der Thumbs wird das Bild, falls komprimiert (z.B. jpeg), schon mal dekomprimiert, was vmtl. mit einem Faktor 10 zu Buche schlägt. Dieses Bild muss dann nach bzw. während der Bearbeitung nochmal im Speicher abgelegt, und schon bist du über das bereits durchaus sehr hohe memory_limit hinausgeschossen.

64MB kriegst du oft nicht einmal bei Paidhostingpaketen.

MP? Minimalpreis? oder doch MB, Megabyte?
Bei eigenen Bildern, insbesondere in der Größe erstellt man die
Vorschaubilder einmalig auf dem eigenen Rechner, nicht auf dem
server. Wenn Bilder von anderen Leuten auf den server geladen
werden sollen, muß man eben auf eine gewissen
Größenbegrenzung hinweisen.

Besonders bei JPEG ist zu beachten, daß das Bild im
Arbeitsspeicher ganz anders abgelegt ist als im JPEG selbst,
welches ja mit verlustbehafteter Kompression arbeitet. Insofern
wird das dekomprimierte, bearbeitbare Bild im Arbeitsspeicher
in der Regel größer sein als das anfängliche JPEG.

MP=Megapixel :wink:

Nun, das wäre dann ja noch deutlich größer als Megabyte, je
nach Modell kann so ein Pixel ja drei oder vier Byte umfassen ;o)
Wobei es da wiederum wohl auch Zählweisen gibt, wo jeder
Farbkanal einen Pixel darstellt…

de.wikipedia.org/wiki/Megapixel

Du solltest pro Skriptaufruf nur 1 Bild verarbeiten und die Bilder mit imagedestroy löschen, wenn du sie nicht mehr brauchst. Dann könnte das Memorylimit ausreichen.

Tut es mit Sicherheit nicht! Je nach verwendetem Script (die nagen nämlich auch am vorhandenen Ram) ist bei 64MB bei Bildern im Bereich von 8MP Ende Rennbahn. Die Dateigröße des JPG ist dabei unerheblich, für den RAM Bedarf zählt die Abmessung. Mal als Beispiel die Ausgabe eines Scriptes, wie sowas in der Realität aussehen kann:

*** SCRIPT START ***
debug test.php> initialize

PHP Memory Limit: 65M Usage before: 42.5 KB

debug test.php> code-lines: 10-36 time: 0.0001 mem: 44 KB

Calculated : 2.45 MB
Loading image 800x600.jpg, size 800 * 600, bpp 8, channels 3… done
debug test.php> code-lines: 36-44 time: 0.0497 mem: 2400 KB
Memory usage: 2.34 MB
Difference: 2.3 MB
Difference / (Width * Height * Bytes per pixel): 1.6761833333333
Destroyed. Memory usage: 44.35 KB

debug test.php> code-lines: 44-36 time: 0.0007 mem: 45 KB

Calculated : 3.93 MB
Loading image 1024x768.jpg, size 1024 * 768, bpp 8, channels 3… done
debug test.php> code-lines: 36-44 time: 0.0775 mem: 3898 KB
Memory usage: 3.81 MB
Difference: 3.76 MB
Difference / (Width * Height * Bytes per pixel): 1.6724073621962
Destroyed. Memory usage: 44.48 KB

[…]

debug test.php> code-lines: 44-36 time: 0.0019 mem: 45 KB

Calculated : 17.6 MB
Loading image 2200x1650.jpg, size 2200 * 1650, bpp 8, channels 3… done
debug test.php> code-lines: 36-44 time: 0.3780 mem: 17790 KB
Memory usage: 17.37 MB
Difference: 17.33 MB
Difference / (Width * Height * Bytes per pixel): 1.6685516988062
Destroyed. Memory usage: 44.64 KB

und hier ein Beispiel für Kapitulation, zu wenig Speicher
debug test.php> code-lines: 44-36 time: 0.0039 mem: 45 KB
Calculated : 72.51 MB
Loading image 4700x3160.jpg, size 4752 * 3168, bpp 8, channels 3…

Fatal error: Allowed memory size of 68157440 bytes exhausted (tried to allocate 19008 bytes) in /www/htdocs/snafu/memory/test.php on line 41

nun wird in diesem debug Script natürlich nicht berücksichtigt, wieviel Ram das benutzte Galerie, CMS oder Blog Script schon verbraten hat (der Speicherverbrauch des debug Scriptes selber ist ja ziemlich gering) , bei einer gängigen Wordpress Installation werden z.B. auch schon ohne exzessiver Nutzung von zusätzlichen Plugins mal locker 20MB aufwärts verbraten, je nach Server (32/64 Bit, Apache Version) undAnzahl der Plugins können es aber auch problemos über 40MB werden.
Auf meinem Paidspace (65MB) kann ich z.B. mit einem schlichten Galleriescript gerade noch Originale einer 5D (12MP) konvertieren, Wordpress (und andere von mir benutzte Galeriescripte) steigen aber schon deutlich früher (bei 8MP Bildern) aus.
Lösungen, wenn man nicht den Provider wechseln möchte, kleiner Bilder oder Thumbnails auf dem eigenen Rechner erzeugen.

ps: die Grösse der JPG Datei ist dabei absolut unerheblich, die Datei des 22001650 Bildes hatte eine Größe von 640kb, während die 47003160 als JPG nur 540kb groß war :smiley:

Die Zahlen sehen ja ziemlich genau nach 5 byte pro Pixel aus,
wobei dann solche Programme oder Skripte oft MB mit MiB
und kB mit kiB verwechseln, was das Rechnen etwas verwirrender
macht.

4 Byte sind ziemlich klar - drei Farbkanäle, ein alpha-Kanal -
oder hat der zwei Byte? Oder wird das fünfte Byte für was
anderes verwendet? Oder alle beide und liegen Bilder mit
alpha-Kanal im Speicher dann bei 6 Byte?

Man kann ja auch zwischen einfacher Farbpalette und dem
24bit-System umschalten. Die einfache Farbpalette hat dann
nur 1 Byte pro Pixel. Wenn die Bibliothek da ordentlich gebastelt
ist, kann man da einen Faktor fünf sparen ;o)