TLENS » 2010.02.10 01:14

Файл db.txt занимает 8 mb.
Выделил оперативки 20m.
Вощем запустил етот скрипт через пару секунд закончилась память.
Поставил на 100m.
Через несколько минут забилась и ета оперативка.
При етом наблюдая за процесом время генерации начиналось от 2 сек. и с каждим выболнением росло.
Пока не дошло до 30 сек. После забилось и 100м оперативы.
Я некое время подумал что надо розтавить unset() ухты время сбилось до одной секунды да и память очистилась.
Но при последующих выполнениях обратно наблюдается рост.
Вчем может быть проблема?
Я уже ниче не пойму. Почему скрипт работает неочищая памяти?

Код:

1
span style="color: #0000BB"><?phplist($generic_msec,$generic_sec)=explode(chr(32),microtime()); $generic_time=$generic_sec+$generic_msec;ini_set('memory_limit',"200M");//------------------------------------------------//$f='';$b='';$g=(int)$_GET['g'];$f=file('db.txt');$b=file('new.txt');/*$c=count($b);for($i<$c; $i>=($c-100); --$i){echo $b[$i].'<hr>';}exit; */for($i=$g; $i<($g+1000); ++$i){if(!in_array($f[$i],$b)){$b[]=$f[$i]; ++$z;}else{++$p;}}unset($f);$fp=fopen('new.txt','w');fputs($fp,implode($b));fclose($fp);unset($b);echo 'Ok! '.$z.'<hr>No '.$p.'<hr>page '.$g.'<hr><META HTTP-EQUIV="REFRESH" CONTENT="0; url=file.php?g='.($g+1000).'">';//------------------------------------------------//list($generic_newmsec,$generic_newsec)=explode(chr(32),microtime()); echo '<hr>'.round((($generic_newsec+$generic_newmsec)-$generic_time),4).' сек.<br>';exit; ?>
Gemorroj » 2010.02.10 12:23

я вообще не понимаю что ты хочешь сделать этим кодом.
добавить в new.txt строки из db.txt ?

TLENS » 2010.02.12 17:20

Ну да в db.txt ключи котые повторяются а в new.txt ключи перебранные и ниодин не повторяется.
Но я уже перебрал мне на дальнейше интиресно почему оперативная память неочищается?

Gemorroj » 2010.02.12 18:02

ну во первых там db.txt вообще в массив считывать не нужно. ($g + 1000) выполняется при каждой итерации. не мудрено что памятьс таким кодом можеть потечь.

TLENS » 2010.02.12 19:57

Нащет ($g + 1000) както не додул.
А вот нащет

не мудрено что памятьс таким кодом можеть потечь.

Непонял что ты хотел сказать.
Почему она может потечь, и как ето потечь?
И почему ненужно зчитывать в массив db.txt? Я другого способа невижу.

Gemorroj » 2010.02.12 20:12

http://ru.wikipedia.org/wiki/Утечка_памяти

TLENS » 2010.02.13 08:00

Ну вот смотри

Код:

1
lt;?for($i=0; $i<1000; ++$i){$b[]=$f[$i];/* Почему здесь уходит память? Я же его пишу в массив И потом освобождаю память.*/} unset($b);?>
Gemorroj » 2010.02.13 11:24

накладные расходы может. нужно смотреть исходники Zend Engine. И пробуй делать все на самых последних стабильных версиях. На данный момент 5.3.1

TLENS » 2010.02.13 20:03

Ладно попробуем но поже.
Спассибо и на етом.

Morgan » 2010.02.13 22:02

У меня такая проблема.
Получается слишком длинная строка (больше доступной оперативной памяти).
Периодически мне приходиться ее очищать, и записывать в сторонний источник.
Будет ли разница, при очистки вариантами
1. $var = null;
2. unset($var);
??

Gemorroj » 2010.02.13 22:05

разница в том, определена ли переменная. сама память должна очиститься в обоих случаях.

Morgan » 2010.02.13 22:06

Gemorroj написал:

разница в том, определена ли переменная. сама память должна очиститься в обоих случаях.

определена

Gemorroj » 2010.02.13 22:10

unset - делает переменную неопределенной. ты же ее удаляешь. а $var = null; ты просто присваиваешь ей значение null