Минимизировать расход памяти при работе с графикой

sniffysko

Новичок
Необходимо в скрипте обработать фотографию, которую подгружает пользователь на сайт. При работе с изображениями нормальных размеров -- все ок. Но как только начинается загрузка монструозных изображений на 18 мегапикселов, то памяти начинает не хватать. Скрипт использует библиотеку GD.
Есть ли варианты библиотек, более бережливых к памяти сервера?
Вариант с уменьшением размеров картинки на компьютере пользователя не подходит.
Однажды встречал рекомендацию использовать Imagick. Он-де память использует экономней. Так ли это?
 

fixxxer

К.О.
Партнер клуба
Универсальные библиотеки работают с битмапом, целиком загруженным в память - как иначе?

Для обработки изображений, не помещающихся в оперативку, есть libvips.
 

С.

Продвинутый новичок
Как вариант -- уменьшать картинку на клиенте перед загрузкой.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Вариант добавить памяти не рассматривается?
Зачем, ведь это стоит денех. Хотя подозреваю, что у автора еще есть не совсем оптимальный код.

Но больше всего мне нравится
Вариант с уменьшением размеров картинки на компьютере пользователя не подходит.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
С., иногда добавить памяти - чтобы заработало, гораздо проще, нежели сидеть и выпиливать оптимизацию на 10%. В итоге на времени программиста ты потратишь больше.

Мне интересно, почему клиентская оптимизация не катит?
 

hell0w0rd

Продвинутый новичок
Не, ну я понимаю видео бы обрабатывалось. А если фоточка, пускай она хоть 500мб весит - в очередь и по одной сжимать, но что-то мне подсказывает, что там vps-ка на 256мб/шаред, отсюда и проблемы.
 

С.

Продвинутый новичок
sniffysko, не надо дописывать требования в стартовое сообщение, оформляй их как новый пост. Иначе коментаторы не по своей вине выглядят эм-м-м... невнимательными.

И еще если что-то "не подходит", то надо объяснять почему, чтобы это не было пустым капризом.
 

Redjik

Джедай-мастер
Повангую, что парень просто не знает, что можно автоматом ресайзить на клиенте до отправки на сервер... посредстовом js/canvas/flash/ичотамеще
Тут типа прихоть - у нас де пользователи ленивые - они не будут ресайзить =)
 

WMix

герр M:)ller
Партнер клуба
а где памяти не хватает, спросили? может у пхп и лечится, простым ini_set'ом? памяти то явно больше чем картинки весят
 

С.

Продвинутый новичок
иногда добавить памяти - чтобы заработало, гораздо проще, нежели сидеть и выпиливать оптимизацию на 10%. В итоге на времени программиста ты потратишь больше.
Иногда (чуть более чем часто), добавка памяти означает переезд на другой сервер. На это тоже надо время программиста.

Мне ничуть не обременительно взять более памятистый сервер, но все же я перед этим попробую сначала софтверную оптимизацию, Не выгадывать по 10% конечно, а полностью сменить подход.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
С., все это хорошо, при наличии времени/денег на то, чтобы тратить это время. Посчитай на досуге, сколько у тебя времени и денег затратит перезапуск сервера в облаке со сменой его мощностей и сколько ты будешь пилить код с "полной сменой подхода". Пока ты будешь пилить, проект будет условно стоять, тебе надо будет что-то кушать, а шефу платить тебе денежку.

Уверен, что перезапустить сервер будет в порядки быстрее и проще. Однако это требует нормального выбора площадки. Хотяяя... думаю дебилам, которые до сих пор предпочитают кроить и хоститься у нас в рашке на nic.ru в нашей области работы не место.
 

С.

Продвинутый новичок
Ты утрируешь. Во-первых, чтобы кликнуть радиобуттон с большей паматью в облаке, надо уже быть в облаке. А это далеко не факт. Не на столько еще облачная у нас атмосфера.

А во вторых, что значит "проект будет условно стоять"? Если он действительно стоит и все бегают кругами с криком: "А-а-а-а", то я буду делат одно. А если изредка какие-то туповатые клиенты грузят фотки по полгигабайта, то я буду делать другое.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
С., понятно, что кликнуть надо не 2 кнопки, чтобы сменить развер VPSки. Но пусть 20 кнопок.

Под "проект стоит" я имел в виду, что код не обработает пользовательские данные за нужное время/отведенные ресурсы. По причине чего у тебя падает выручка и появляются недовольные юзвери. Хотя на нормально построенном проекте я не знаю, что надо сделать, чтобы получить нечто подобное как у ТС. Как правильно обработка изображений, их загрузка и последующая отдача - три разных и слабосвязанных вещи.

Ждем автора.
 

Redjik

Джедай-мастер
Хотяяя... думаю дебилам, которые до сих пор предпочитают кроить и хоститься у нас в рашке на
посмотрел тарифы на хостинг на никах ру ... мдя
у меня дешманская впска за 3 евро, дешевле самого дешманского хостинга у этих ребят.
6гиг места, 400 оперативы
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Redjik, это ты еще не пытался у них там собрать php)))
 

sniffysko

Новичок
Спасибо за внимание.
Лимит памяти на хостинге -- 64 м. Как по мне, для обычной работы -- выше крыши.
Почему я стараюсь избежать ресайза на стороне клиента: это админка сайта, где фотки будут заливать зачастую женщины. Обучать их ресайзить фото -- лучше повеситься.
Размер фотки 5184 х 3456.
А вот расход памяти по ходу выполнения скрипта (байт) в локале с лимитом в 128 м:
569 928
90 241 112
90 554 304
884 432
572 032

А вот скрипт:
Код:
function GenThumb($srs_file) {
    $new_h = 200;

    echo memory_get_usage() . "\n";

    $src_img = ImagecreateFromJPEG ($srs_file);
    $w = imagesx($src_img);
    $h = imagesy($src_img);

    echo memory_get_usage() . "\n";

    $new_w = floor($new_h / $h * $w);
    $new_img = imagecreatetruecolor($new_w, $new_h);

    echo memory_get_usage() . "\n";

    imagecopyresampled($new_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, $w, $h);
    imagedestroy($src_img);

    echo memory_get_usage() . "\n";

    $new_img = UnsharpMask($new_img, IMAGE_SHARPEN_AMOUNT, IMAGE_SHARPEN_RADIUS);
    imagejpeg($new_img, $res_file, 95);

    imagedestroy($new_img);

    echo memory_get_usage() . "\n";
}
 

Вурдалак

Продвинутый новичок
Почему я стараюсь избежать ресайза на стороне клиента: это админка сайта, где фотки будут заливать зачастую женщины.
Чувак, под «клиентом» тут понимают браузер. Т.е. JavaScript, вот это всё. А не вручную. На vk.com, по-моему, фотки тоже ресайзятся на клиенте, но ты же этого даже не замечаешь.

А на стороне сервера с такими требованиями ты ничего не сделаешь.
 
Последнее редактирование:
Сверху