Вопрос по работе с большими YML файлами с PHP

TK
На сайте с 14.06.2014
Offline
1
1852

Проблема распарсить файл размером около 500Мб, сервер простенький и в целом-то проблема что все идет одним файлом, нужно распарсить и поместить в БД, там уже проще будет.

Пока пробую, но на регулярке сервер соединение сбрасывает:

preg_match_all('/<offer(.*)<\/offer>/Uis', $s, $r);

Как бы его перенести в БД, да так чтобы хватило "мощьностей", тем более что может быть и больше надо будет... Как вариант думал считывать по 512кб к примеру, искать вхождения уже там и так считывать его по кусочкам, лучше ничего не могу найти

ДП
На сайте с 23.11.2009
Offline
203
#1

Курите мануал по http://ru2.php.net/manual/ru/class.xmlreader.php - это потоковый парсер, он не загружает сразу весь файл, а читает его по нодам.

TK
На сайте с 14.06.2014
Offline
1
#2

Дикий пионер,

Спасибо, пошло нормально хотя CPU и ест до 99%, памяти всего 10Мб есть, до того ему и 1Gb не хватало на эти 500Мб файл

---------- Добавлено 14.06.2014 в 21:56 ----------

Примерно так, ну и быстро все это прошел за минуту, я думал все хуже будет


$reader = new XMLReader();
$reader->open('/var/www/site.ru/htdocs/_back/_temp/YML.xml');
$offer = array();
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLReader::ELEMENT):
// если находим в xml элемент <offer> начинаем обрабатывать его
if ($reader->localName == 'offer') {

// мы будем формировать массив который будет содержать все дочерние элементы элемента <offer>
$offer = array();
while ($reader->read()){

if ($reader->nodeType == XMLReader::ELEMENT) {
$name = strtolower($reader->localName);
while ($reader->moveToNextAttribute()){
// здесь мы получаем атрибуты если они есть
$offer[$name]['__attribs'][$reader->localName] = $reader->value;
}
$reader->read();
if (isset($offer[$name]) && is_array($offer[$name])){
$offer[$name]['value'] = $reader->value;
} else {
$offer[$name] = $reader->value;
}

}

if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName == 'offer'){
break;
}

}

// в этом месте мы уже имеем сформированный массив для каждого узла
#print_r($offer);


}
}
}
N
На сайте с 06.05.2007
Offline
419
#3

TTRDK, допустим, функция preg_match_all вам известна, что ж вы не попробовали другие функции pcre ?

можно было догадаться и сделать в цикле по одному элементу.

Кнопка вызова админа ()
ДП
На сайте с 23.11.2009
Offline
203
#4

TTRDK, ну вот видите как хорошо все получилось. Грамотному человеку достаточно одну ссылку дать и он разберется сам что да как.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий