Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi (1 - 8)
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 smile.gif

Pokaż kod jakim przerabiasz grafikę. Musisz tam mieć mocno coś zamotane skoro przekraczasz 64mb pamieci RAM.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 18:49