парсер большого xml приблизительно 300 мб

e-orel

Новичок
парсер большого xml приблизительно 300 мб

Здравствуйте...
Ребят скажите нужно из XML положить данные в БД.
Сделал на маленьких файлах всё работает нормально .
на 300 мегобайтных виснет. Подскажите как сделать что бы для памяти было нормально.

Готов заплатить за помощь!
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а сколько платишь?

-~{}~ 06.03.09 14:37:

варианта 2: взять сервер с кучей памяти или парсить XML построчно
 

findnext

Новичок
e-orel
что значит виснет ?? включи ошибки и покажи текст ошибки, я так подозреваю что время выполнения скрипта ограничено или memory limit слишком маленький, но в любом случае это можно изменить если хостер позволяет
 

e-orel

Новичок
так вот именно я могу сделать это локально но когда парсиш памяти на скрипт выделяеца 128 помоему!!! Ошибки нет никакакой. Я вот думаю есть способ как то частями парсить . Допустим по 20 мегобайт брать потом ещё 20 и т.д!!!!
щас код дам своего скрипта.




$xml = simplexml_load_file('./my.xml');
$p_cnt = count($xml->shop->offers->offer);
echo $p_cnt; // тут типа проверяю....
for($i = 0; $i < $p_cnt; $i++) {

$id = $xml->shop->offers->offer[$i][id];
//$available = $xml->shop->offers->offer[$i][available]; //параметр определяет есть ли на складе или нет он не определяет
$url_tov="http://www";// определяем и пишем вручную..
$price=$xml->shop->offers->offer[$i]->price;// цена товара
$valuta= $xml->shop->offers->offer[$i]->currencyId;
$categoryId=$xml->shop->offers->offer[$i]->categoryId;
$picture=$xml->shop->offers->offer[$i]->picture;
$name=$xml->shop->offers->offer[$i]->name;
$author=$xml->shop->offers->offer[$i]->author;
$publisher=$xml->shop->offers->offer[$i]->publisher;
$series=$xml->shop->offers->offer[$i]->series;
$year=$xml->shop->offers->offer[$i]->year;
$description=$xml->shop->offers->offer[$i]->description;



$description=iconv("UTF-8", "Windows-1251", $description);
$name=iconv("UTF-8", "Windows-1251", $name);
$author=iconv("UTF-8", "Windows-1251", $author);
$publisher=iconv("UTF-8", "Windows-1251", $publisher);
$series=iconv("UTF-8", "Windows-1251", $series);


Ошибок тут нет.... но если xml 300 метров то всё повисает!
 

Савелей

Новичок
Да... Вы пытаетесь загрузить все в память и еще потом работать...

надо все делать по частям.
 

dimagolov

Новичок
а по-моему надо затягивать этот xml в БД и работать с БД а в следущий раз не вестись на модные названия технологий, а думать головой, прежде чем что-то делать.
 

e-orel

Новичок
Савелей .... Да а как файлик то мне по частям разбить. Помогите сижу тут уже фтыкаю перед монитором!

Спасибо!

-~{}~ 06.03.09 17:11:

dimagolov так я и пытаюсь его в БД запхать!!! в первом моём посте об этом написано!
 

dimagolov

Новичок
e-orel, ты про структуру xml кроме того, что его можно распарсить через simplexml_load_file что-то знаешь?

откуда он такой большой берется и почему нельзя то же самое получить меньшими частями?
 

e-orel

Новичок
его скачиваю одним файлом, грубо говоря он ко мне поступает одним файлом большим! и собственно его мне надо в БД переложить и всё!! Вам структура файла нужна? я могу вам показать..
 

Фанат

oncle terrible
Команда форума
интересно, почему раздел "PHP & XML" есть, а "PHP & CSV" или "PHP & TXT" - нету?..
 

AmdY

Пью пиво
Команда форума
e-orel
так он к тебе _поступает_ одним большим файлом, а заставлять его обрабатывать целиком никто не просит, я тебе дал инструмент, в цикле считываешь нужный кусок, заносишь в базу
 

Viktor_Rez

Новичок
e-orel Если всё же будет вылетать по таймауту - стучи в ЛС - сделаем у меня на серваке.

-~{}~ 07.03.09 03:19:

e-orel Разбить по iframe
 

Viktor_Rez

Новичок
Есть такая замечательная ф-ция fread and fseek

-~{}~ 07.03.09 03:43:

В компоненте они как dd в *Nix
 

fixxxer

К.О.
Партнер клуба
>> интересно, почему раздел "PHP & XML" есть, а "PHP & CSV" или "PHP & TXT" - нету?..
ммм.... потому что некоторые одаренные личности пихают по 300 мегабайт в xml? ;)

правильный ответ на вопрос - предложить тому, кто придумал гонять такие объемы в xml, засунуть эту xmlину себе в какое нибудь место на его усмотрение.
 

Viktor_Rez

Новичок
PHP & TXT? Жесть!
Что есть "тхт" файл с точки зрения прграммиста и ОС?
 

e-orel

Новичок
$reader = new XMLReader();
$reader->open('new.xml');
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):

if ($reader->name == "picture")
{
$reader->read();
$code = trim($reader->value);
echo "$code <br>";
break;
}

}
}


Всем огромное спасибо за помощь.
Вопрос решил...
Вот собственно код какой у меня получился...
Всё отлично!!!

-~{}~ 09.03.09 09:50:

ага... видимо не всё
не могу получить
<category id="1075982" parentId="1084752">текст</category>
id и parentId
блин перерыл всё... есть какие идеи?
 
Сверху