Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Brak pamięci
Lirdoner
post
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witaj, niestety trochę zbyt mało podałeś informacji (IMG:style_emoticons/default/smile.gif)

Pokaż kod jakim przerabiasz grafikę. Musisz tam mieć mocno coś zamotane skoro przekraczasz 64mb pamieci RAM.
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Lirdoner
post
Post #6





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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) { }
Go to the top of the page
+Quote Post
Sephirus
post
Post #7





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Sephirus 18.06.2013, 15:18:28
Go to the top of the page
+Quote Post
Lirdoner
post
Post #8





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


nic nie pomaga ;/
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 17:51