[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Out of memory
S77R
Всем добрый день.
Уже неделю ломаю голову.
Сайт агентства недвижимости.
Есть несколько папок - RLT_CITY, RLT_DISTRICT, RLT_STREET и RLT_MAIN, в них содержатся файлы xml - в CITY - города, DISTRICT - районы, STREET - улицы и MAIN - основная информация по объектам, в CITY, DISTRICT и STREET содержатся мало файлов (максимум 100), а вот в MAIN около 4000 (разбито еще на несколько папок, в каждой по 1000 записей (RLT_MAIN/1, RLT_MAIN/2 и т.д. - думал поделить по 1000 записей на цикл, тоже не помогает, то же самое, как и все 4000 в корневой папке RLT_MAIN)
скрипт считывает поочередно каждую папку и заносит данные в MySQL датабазу, все работает, но до определенной записи, затем выдает ошибку SimpleXML parser error: out of memory error. Не могу понять, что забивает память. Помогите разобраться пожалуйста.

<?
$time = time();
$db = mysql_connect('xxx.xxx.xxx.xxx', 'userxxxx', 'xxxxxxx');
mysql_select_db('xxxx', $db) or die (mysql_error());
mysql_query("SET NAMES utf8");
$dir='RLT_STREET';
$files=scandir($dir);
for ($i=0; $i<count($files); $i++)
{
if ($files[$i]=='.' or $files[$i]=='..') continue;
$xml = $dir."/".$files[$i];
$res = simplexml_load_file($xml);
$data = $res->RLT_STREET;
$id = $data->ID;
$id = str_replace("01297", "", $id);
$street = $data->NAME;
$q = mysql_query("select ID from STREET where ID=$id") or die("Invalid query q_street: " . mysql_error());
if (mysql_num_rows($q)==0) $q2 = mysql_query ("insert into STREET values ($id, '$street')") or die("Invalid query q2_street: " . mysql_error());
else $q3 = mysql_query("update STREET set NAME='$street' where ID=$id") or die("Invalid query q3_street: " . mysql_error());
}
if (is_resource($q)) mysql_free_result($q);
if (is_resource($q2)) mysql_free_result($q2);
if (is_resource($q3)) mysql_free_result($q3);
$dir='RLT_DISTRICT';
$files=scandir($dir);
for ($i=0; $i<count($files); $i++)
{
if ($files[$i]=='.' or $files[$i]=='..') continue;
$xml = $dir."/".$files[$i];
$res = simplexml_load_file($xml);
$data = $res->RLT_DISTRICT;
$id = $data->ID;
$id = str_replace("01297", "", $id);
$district = $data->NAME;
$q = mysql_query("select ID from DISTRICT where ID=$id") or die("Invalid query q_district: " . mysql_error());
if (mysql_num_rows($q)==0) $q2 = mysql_query ("insert into DISTRICT values ($id, '$district')") or die("Invalid query q2_district: " .

mysql_error());
else $q3 = mysql_query("update DISTRICT set NAME='$district' where ID=$id") or die("Invalid query q3_district: " . mysql_error());
}
if (is_resource($q)) mysql_free_result($q);
if (is_resource($q2)) mysql_free_result($q2);
if (is_resource($q3)) mysql_free_result($q3);
$dir='RLT_CITY';
$files=scandir($dir);
for ($i=0; $i<count($files); $i++)
{
if ($files[$i]=='.' or $files[$i]=='..') continue;
$xml = $dir."/".$files[$i];
$res = simplexml_load_file($xml);
$data = $res->RLT_CITY;
$id = $data->ID;
$id = str_replace("01297", "", $id);
$city = $data->NAME;
$q = mysql_query("select ID from CITY where ID=$id") or die("Invalid query q_city: " . mysql_error());
if (mysql_num_rows($q)==0) $q2 = mysql_query ("insert into CITY values ($id, '$city')") or die("Invalid query q2_city: " . mysql_error());
else $q3 = mysql_query("update CITY set NAME='$city' where ID=$id") or die("Invalid query q3_city: " . mysql_error());
}
if (is_resource($q)) mysql_free_result($q);
if (is_resource($q2)) mysql_free_result($q2);
if (is_resource($q3)) mysql_free_result($q3);
unset($res);
unset ($data);
$dir='RLT_MAIN';
$pa=scandir($dir);
$rnd = rand(0, 10000);
for ($q1=0; $q1<count($pa); $q1++)
{
if ($pa[$q1]=="." or $pa[$q1]=="..") continue;
else $files=scandir($dir."/".$pa[$q1]);
for ($i=0; $i<count($files); $i++)
{

if ($files[$i]=='.' or $files[$i]=='..') continue;
$file = "$dir/$pa[$q1]/$files[$i]";
$xmlstr = file_get_contents($file);
$xml = new SimpleXMLElement($xmlstr);
foreach($xml as $node)
{
$arr[$node->getName()] = $node;
}
$id = $arr[RLT_MAIN]->ID;
$id = str_replace("01297", "", $id);
$ac = $arr[RLT_MAIN]->ACTIONCODE;
$oc = $arr[RLT_MAIN]->OBJECTCODE;
/* ...... здесь считываем переменные ....... */
$c1 = $arr[RLT_MAIN]->CUSTOM1ID;
$c2 = $arr[RLT_MAIN]->CUSTOM2ID;
$afi = $arr[RLT_MAIN]->ARCFLAGID;
$q = mysql_query("select id from MAIN where id=$id") or die("Invalid query q_main: " . mysql_error(). " ID = $id");
$qs = "insert into MAIN values ($id, $ac, $oc, '$qd', '$lcd', $ci, $di, $si, '$h', $hc, $hrs, $hr, $by, $r, $fc, $ga, $ka, $pc, $fsc, $bc, $l, $c,

'
$com', $nlc, $ltc, $ec, $cm, '$ss', $c1, $c2, $afi, $rnd)";
if (mysql_num_rows($q)==0) $q2 = mysql_query ($qs) or die("Invalid query q2_main: " . mysql_error()."<br> $qs");
else
{
$z = "update MAIN set actioncode=$ac, querydate='$qd', lastcalldate='$lcd', cityid=$ci, districtid=$di, streetid=$si,

housen='
$h', housecode=$hc, hrows=$hrs, hrow=$hr, buildyear=$by, rooms=$r, flatcode=$fc, generalarea=$ga, kitchenarea=$ka, plitacode=$pc,

flatstatecode=
$fsc, balkoncode=$bc, land=$l, cost=$c, comments='$com', naznachlandcode=$nlc, landtitulcode=$ltc, elektrosetcode=$ec, costm=$cm,

sroksdachi='
$ss', custom1id=$c1, custom2id=$c2, arcflag=$afi, random=$rnd where id=$id";
$q3 = mysql_query($z) or die("Invalid query q3_main: " . mysql_error());
}
if (is_resource($q)) mysql_free_result($q);
if (is_resource($q2)) mysql_free_result($q2);
if (is_resource($q3)) mysql_free_result($q3);
unset($xml);
unset($xmlstr);
}
}

$q4 = mysql_query ("select id from MAIN where random<>$rnd") or die("Invalid query q_id " . mysql_error());
echo ("rnd = $rnd <br>".mysql_num_rows($q4)."<br>");
mysql_close($db);
$vr = time()-$time;
echo ("Скрипт выполнен за ".$vr." секунд");
?>




Спустя 3 часа, 55 минут, 53 секунды (3.10.2011 - 07:39) alex12060 написал(а):
4 цикла, 4 скана, дофига выборок из БД и только в самом конце 2 ансета. Не мудрено smile.gif

Спустя 29 минут (3.10.2011 - 08:08) linker написал(а):
1. Попробуй пользоваться не scandir'ом, а opendir(), readdir(), closedir().
2. Почему
$xmlstr = file_get_contents($file);
$xml = new SimpleXMLElement($xmlstr);
вместо чего-то похожего на
$res = simplexml_load_file($xml);

Спустя 20 минут, 24 секунды (3.10.2011 - 08:28) Dezigo написал(а):
У тебя 3 раза повторяется циклы.
for ($i=0; $i<count($files); $i++) {}

Сделай его одним.

Спустя 1 час, 42 минуты, 25 секунд (3.10.2011 - 10:10) S77R написал(а):
Цитата (linker @ 3.10.2011 - 05:08)
1. Попробуй пользоваться не scandir'ом, а opendir(), readdir(), closedir().
2. Почему
$xmlstr = file_get_contents($file);
$xml = new SimpleXMLElement($xmlstr);
вместо чего-то похожего на
$res = simplexml_load_file($xml);

1. Ага, вместо скандира можно попробовать использовать другие функции, может поможет, спасибо. Отпишусь.
2. При simplexml_load_file($xml) - out of memory почему-то вылетает еще раньше, я так тоже пробовал.

Спустя 2 минуты, 49 секунд (3.10.2011 - 10:13) S77R написал(а):
Цитата (Dezigo @ 3.10.2011 - 05:28)
У тебя 3 раза повторяется циклы.
for ($i=0; $i<count($files); $i++) {}

Сделай его одним.

Не, они там циклы разные папки перебирают... и соответственно разное count($files)

Спустя 1 час, 20 минут, 13 секунд (3.10.2011 - 11:34) kovalevsky написал(а):
ну так напиши одну функцию, которая будет в зависимости от параметров выполнять цикл
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.