Из ниоткуда, при 99мб. Fatal error: Allowed memory size

vg2k

Новичок
Из ниоткуда, при 99мб. Fatal error: Allowed memory size

Код хватает пользователей из старой БД и переводит в новый движок (новую БД).
PHP:
	$res = $oldDb->query("SELECT * FROM `users` WHERE 1");
	while ($t= $oldDb->fetch_assoc($res))
	{
		//print_r($t);
		echo $t['name'].$t['id'].', '; flush();
		
		$item = new User(0);
		$item->name = $t['name'];
		$item->pwd = $t['pwd'];
		$item->email = $t['email'];
		$item->phone = $t['phone'];
		$item->fax = $t['fax'];
		$item->org_name = $t['organization'];
		$item->org_address = $t['address'];
		$item->org_info = $t['agency_info'];
		$item->account_type = ($t['agency']) ? 'agencie' : 'owner';
		//print_r($item);
		$item->save();
		$item->setValue('id',$t['id']);
		unset($item);
		unset($t);
	}

Проблема в том, что вылетает ошибка:
Allowed memory size of 20971520 bytes exhausted (tried to allocate 4864 bytes)
примерно на 200+ пользователе...

поставил ini_set("memory_limit","99M");
и получаю ошибку:
Allowed memory size of 103809024 bytes exhausted
примерно на 1100+ пользователе...

ужас, откуда такая прожорливость ? Куда девается память ? Раньше с таким не сталкивался. А ведь далее идет "перегон" остальных данных: 10-ки тысяч записей.

Похожих топиков не нашел, разве что:
http://phpclub.ru/talk/showthread.php?s=&threadid=70396&highlight=Allowed+memory+size+of+bytes+exhausted
на там в массив все шло.

вариант, что результат mysql_query() весит - отпадает... судя по этому топику:
http://phpclub.ru/talk/showthread.php?s=&threadid=87273&highlight=memorylimit
 

440hz

php.ru
ну так query и зачитывает всех твоих юзеров сразу в память libmysql или ты думаешь что fetch их по одну из базы тягает?
 

vg2k

Новичок
440hz
но память libmysql не считается памятью, выделенной под процесс пхп-ки, как я понимаю. Т.е. не попадает под memory_limit
 

whirlwind

TDD infected, paranoid
vg2k посмотри, не ли внутри User циклических ссылок. Действительно ли после unset($item) вызывается конструктор

PS. что бы этому GC пусто было
 

confguru

ExAdmin
Команда форума
print_r($item)
сделай и увидишь куда память утекает :)
 

cDLEON

Онанист РНРСlub
Я конечно не вкурсе логики работы mysql_query и mysql_fetch на си. Но я бы проверил libmysql.dll вызывает ошибку, либо это делает твой код.
PHP:
$bd->query("");
while($db->fetch_array());
Если точно так же выбросит - всё будет ясно. Если же нет - проблема с классом User.
 

vg2k

Новичок
забыл поделиться радостью, что трабла решена.. все, как всегда, банально оказалось.

В движке было логирование (для отладки), которое втихоря было включено и жрала себе в переменную дофига действий движка: текстом. Плюс лог БД запросов. Сам поражаюсь как такими логами можно при создании 200 объектов набрать 20 мб.... поэтому вариант лога и не брал в расчет, но вот так воть...

а без этих логов:
память до создания объектов: 2 181 048
память после создания 5000 объектов : 2 254 864

Всем спасибо.
 
Сверху