Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Brak pamięci
Forum PHP.pl > Forum > Przedszkole
Lirdoner
Witam, korzystając z funkcji imagecreatefromjpeg() otrzymuję błąd o przekroczeniu pamięci
Kod
Fatal error: Allowed memory size of 67108864 bytes exhausted

Serwerownia odpisała abym przerobił skrypt tak aby zużywał mniej pamięci więc teraz moje pytanie jak mogę utworzyć miniaturkę w php nie korzystając z tej funkcji lub zmniejszając zużycie tej pamięci?
Sephirus
Witaj, niestety trochę zbyt mało podałeś informacji smile.gif

Pokaż kod jakim przerabiasz grafikę. Musisz tam mieć mocno coś zamotane skoro przekraczasz 64mb pamieci RAM.
nospor
Cytat
Musisz tam mieć mocno coś zamotane skoro przekraczasz 64mb pamieci RAM.
Skoro wczytuje obrazek przez funkcję i imagecreatefromjpeg() a obrazek ten ma ponad 60MB to raczej nic dziwnego, że mu pamięć przekracza
Sephirus
Cytat
Skoro wczytuje obrazek przez funkcję i imagecreatefromjpeg() a obrazek ten ma ponad 60MB to raczej nic dziwnego, że mu pamięć przekracza


Nie wiemy czy dlatego mu przekracza czy nie bo nic więcej nie napisał - ani nie pokazał kodu ani nie podał rozmiaru obrazka itd. Równie dobrze może być to coś innego przed samym wczytaniem, które dobije skrypt.

@autor pokaż kod dla pewności i napisz jakiej wielkości fotki tam ładujesz - wtedy się coś poradzi.
Crozin
64 MiB to obraz o rozdzielczości ok. 22 megapikseli po wczytaniu do pamięci, czyli nic specjalnie nadzwyczajnego. Jedyny sposób to przetwarzanie obrazu po kawałku, a nie w całości na raz.
GD się do tego nie nada, zaś bindingi PHP dla ImageMagicka nie obsługują chyba wszystkich opcji. Odpalając Imagicka z poziomu konsoli, możesz przy pomocy parametru -limit określić maksymalne wykorzystanie pamięci.
Lirdoner
No więc zdjęcia ma 6,45MB wymiary 2912x4368
Korzystałem z klasy do tworzenia miniaturek http://phpthumb.gxdlabs.com/ a potem zmieniłem cały proces tworzenia miniaturek do
  1. list($width, $height) = getimagesize($dir);
  2. $proporcje = $height / $width;
  3. $wysokosc = 150 * $proporcje;
  4. $canvas = imagecreatetruecolor(150, $wysokosc);
  5. $org = imagecreatefromjpeg($dir);
  6. imagecopyresampled($canvas, $org, 0, 0, 0, 0,150, $wysokosc, $width, $height);
  7. imagejpeg($canvas,$new_dir,70);

ale poprawy nie ma. Może to być jeszcze związane z tym, że skrypt pobiera pliki w katalogu i po kolei w pętli tworzy te miniaturki
  1. foreach (new DirectoryIterator(PUBLIC_DIR . 'upload/script') as $file) { }
Sephirus
Zrób mały debug i zobacz ile pamięci zużywa przy każdej iteracji (memory_get_peak_usage(true)) i stosuj imagedestroy($canvas) i imagedestroy($org) po każdym zapisie.

EDIT: bzdurę dalej napisałem przepraszam - zapomniałem o pętli.
Lirdoner
nic nie pomaga ;/
erix
Jak sobie wyobrażasz zmieścić to w pamięci?

2912x4368 = 12719616 x 3 bajty na kolor = 38158848 = ~37 MiB

Nigdzie nie napisałeś, że zwalniasz dany zasób, to po dwóch iteracjach koniec.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.