[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсинг огромного XML
arlamar
Всем привет.

Столкнулся сегодня с проблемой парсинга XML размером 218Мб.
Может кто-нибудь уже сталкивался, посоветуйте как сделать?

SimpleXMLElement приводит к
Fatal error: Allowed memory size of 268435456 bytes exhausted

Регулярками достал категории, их там всего 1 300+, а вот когда дело доходит до товаров то беда, тоже памяти не хватает. Товаров там сотни тысяч.
alexbel2404
может разбить файл на несколько? SimpleXML правда тут уже не прокатит, придется только регулярками.
Rand
SimpleXML загружает весь документ в память, используйте XMLReader http://php.net/manual/ru/book.xmlreader.php
arlamar
Спасибо, сейчас почитаю как с ним работать.
SlavaFr
можно и с обыкновеным SAX парсером работать.
Примеры в документации http://www.php.net/manual/en/example.xml-structure.php

А что ты конкретно делаеш с xml и какая структура?

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
arlamar
Каталог интернет магазина хочу в БД засунуть.
Решил проблему так: построчно читаю файл и достаю регуляркой что нужно.
johniek_comp
я бы использовал nodejs для обработки IO, на будущее.

_____________
user posted image
FatCat
Я разносил базу Пастухова - какое-то огромное количество гигов.
Принцип работы, надеюсь, будет понятен:
set_time_limit(0);
$file = 'E:\\temp\SortedHugeKeywords.txt';
$c_words = 100000;
$str = $_GET['str'];
if($_GET['str'] == "Start!!!")$str = "";
$i = intval($_GET['i']);
$words = 0;
$go = TRUE;
$fh = fopen($file, "r");
while($go and $words<$c_words)
{
if(feof($fh))
{
$go = FALSE;
}
else
{
fseek($fh,$i);
$str .= fread($fh, 1);
$i++;
if(stristr($str,"\n")) // Забрали строку
{
// Работаем со строкой
}
}
}

fclose($fh);
$this->result = '<table border="1" align="center">
<form action="index.php">
<input type="hidden" name="act" value="module">
<input type="hidden" name="module" value="file">
<tr>
<td>Кусок строки:<input type="text" name="str" value="'
.$str.'"></td>
</tr>
<tr>
<td>Позиция:<input type="text" name="i" value="'
.$i.'"></td>
</tr>
<tr>
<td><input type="submit" name="go" value="!!!"></td>
</tr>
</form></table>'
;
if($go)$this->result .= "<meta http-equiv=\"Refresh\" Content=\"10; URL=index.php?act=module&module=file&str=%20&i=".$i."\">";



_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

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