Работа с gd - вычисление максимума потребляемой памяти

Jayne

Новичок
Работа с gd - вычисление максимума потребляемой памяти

Здравствуйте. Возникла необходимость узнать максимальное значение памяти, которое будет потрачено на создание превью изображение через imagecopyresampled() в зависимости от типа изображения. Может кто сталкивался с данной проблемой? Буду благодарен за любую информацию.
 

Фанат

oncle terrible
Команда форума
А эмпирически? взять несколько картинок с разными разрешениями и попробовать построить график
 

Krishna

Продался Java
Jayne
От типа изображения врядли что будет зависеть. Потому как сначала происходит конвертация во внутреннее представление, которое скорее всего некомпрессированное.
Стоит эскпериментальным путём проверить и всего делов.
 

Jayne

Новичок
Спасибо за советы. Буду тестить - но думаю существуют более точные алгоритмы для вычисления потребляемой памяти.
p.s. 2Krishna мне кажется, что памяти при обработки 8-битного png явно потребуется меньше, чем для 24 битного c альфа каналом.
 

Major

Новичок
Я для своей либы, работающей с изображдениями, такой вот метод наваял в свое время.

PHP:
	/**
	 * Динамически выделяет память для ресурса GD под заданное изображение,
	 * если задан флаг CWpu_Multimedia_Image::$malloc_memory == true
	 * @throws OverflowException если размер изображения певышает выделенный пыхе лимит памяти
	 */
	private function mallocMemory()
	{
		$image_info = getimagesize($this->_source_file);
		$memory_needed =
			round
			(
				(
					$image_info[0] *
					$image_info[1] *
					$image_info['bits'] *
					$image_info['channels']
					/8+ pow(2,16)
				) * 1.65
			);

		$memory_limit = ini_get('memory_limit') *1048576;
		$memory_get_usage = memory_get_usage();

#var_dump($memory_get_usage + $memory_needed, $memory_limit, ini_get('memory_limit'));

		if (($ram = $memory_get_usage + $memory_needed) > $memory_limit)
		{
			if(CWpu_Multimedia_Image::$malloc_memory)
			{
				if(false === ini_set('memory_limit', ceil(($memory_get_usage + $memory_needed + 1048576)/1048576).'M'))
					throw new OverflowException('Не удалось выделить дополнительную память для работы с изображением');
			}
			else
				throw new OverflowException("Размер необходимой памяти(" . round($ram/1024/1024,2) . "M) для работы с изображением превышает доступный " . ini_get('memory_limit'));
		}
	}
Посмотрите. Мож чо дельное для себя отсюда отковыряете...
 

Jayne

Новичок
2Major Интересна формула. Если не секрет, откуда она взялась? Просто потратив довольно много времени на гугл, натыкался на разные варианты - и все они явно не были тру.
Вот примеры:
$w * $h * 3 (+1 alpha) byte
Или $w * $h * $info['bits']

p.s Вот мне еще интересно, почему memory_get_usage() не показывает потребляемую память модулем GD? Перед вызовом функции и после выполнения скрипта до destroy разница потребляемой памяти различается в несколько байт.

p.s.s. Да и еще подумав такой вопрос. Если мы ресайзим изображение, то фактически у нас должно быть 2 ресурса - первый на исходник, а второй на создаваемое изображение. Исходник загружается в память в данном случае, или просто хранится симлинк на ресурс, как при fopen?
 

scam87

Новичок
Major,
смотрю код-то очень знакомый оказался :)
где-то я его видел уже ;)
 

Major

Новичок
scam87

Как где? У нас же на работе... Суть коммента к чему? =)

-~{}~ 05.06.09 01:47:

Jayne
Интересна формула. Если не секрет, откуда она взялась?
Это результат длительного гугления и личного опыта + эмпирический метод, на основе тестов... У меня тут не точное вычисление. Тут округление вправо с "запасом", чтобы наверняка.
 

Jayne

Новичок
Мне вот интересно, чем вы тестировали потребляемую память? memory_get_usage() не учитывает память, которая выделяется для gd. xdebug trace тоже никакой полезной информации не показывает (хотя наверное он как раз и использует memory_get_usage()).
 

Major

Новичок
делал

var_dump($memory_get_usage + $memory_needed)

память, которая уже затрачена + память, которая может понадобиться, ориентируясь на ini_get('memory_limit')

и опытным путем подгонял формулу до тех пор, пока на разных имаджах не давало желаемого результата. Вот уже полгода пользуюсь, тем что наваял - пока проблем небыло. Но если кто-то может тут что-то улучшить - буду только рад. Самому интересно, кто как еще такую задачу решал/решает...
 
Сверху