powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Формирование большого файла XML средствами PHP
19 сообщений из 19, страница 1 из 1
Формирование большого файла XML средствами PHP
    #39321066
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

подскажите пожалуйста, кто знает наиболее оптимальный алгоритм для формирования большого файла XML.
Сейчас я формирую XML файл стандартным способом
Код: php
1.
$xml=new domDocument('1.0','utf-8');


И дальше добавляю элементы, атрибуты и детей.
Все хорошо, пока количество записей из БД не переваливает за 20 тыс. Начинает подвисать и падать сервер.
Проблема в нехватке памяти.

Как сделать этот сбор оптимально.
Делать промежуточное сохранение файла и потом заново открывать его на запись и продолжать писать в конец.

Спасибо.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39321069
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLine,

в случае большого объёма данных - лучше использовать не DOM, а потоковую запись - XMLWriter
( http://php.net/manual/en/book.xmlwriter.php )
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39321095
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторв случае большого объёма данных - лучше использовать не DOM, а потоковую запись - XMLWriter
В этом случае данные будут сразу писаться в файл?
Не будет память тратиться, а только время выполнения скрипта?

Или операции просто более быстрые?
Я просто полагаю, что количества записей у меня перевалит за 100 тыс.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39321161
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLine,

можно в файл, а можно сразу клиенту отдавать.

запись в поток - быстрее и памяти не жрёт по сравнению с построением дерева( у дом-дерева есть другие преимущества)

100к записей - понятно. Размер записи типичный?


PS что характерно - ничего php-специфичного в этом нет
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39321983
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Размер записи типичный.
Переписал на XMLWriter.

Поставил лимит 20 тыс.
Скрипт очень долго выполняется. Уже мину 5.


всего несколько команд используется из XMLWriter.
Как вообще оптимизировать?
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39321998
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLine,

затык скорее не в выводе данных, а в их подготовке к выводу.

XMLWriter несколько десятков мегабайт в секунду легко отдаёт
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322008
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы имеете ввиду сама запись данных в файл долго происходит?

sql запрос простой. просто вытаскивает все.

Дальше я каждые 1000 итераций делаю
Код: php
1.
file_put_contents($fileXml, $xml->flush(true), FILE_APPEND);


Чтоб память очищалась.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322039
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLineВы имеете ввиду сама запись данных в файл долго происходит?
запись быстро происходит

NewLineДальше я каждые 1000 итераций делаю
выкиньте эту "оптимизацию", XMLWriter сам в состоянии в поток писать(в файл или клиенту отдать)

Код: php
1.
2.
3.
4.
$s= new XMLWriter();
$s->openURI('php://output');
// или
$s->openURI("file:///var/tmp/test.xml");
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322149
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да, вроде 20 тыс. записей он протянул.
Но если больше, все равно какая-то оптимизация нужна.

Или мощности сервера увеличивать.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322256
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLine,

код показывай.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322269
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторкод показывай.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//Путь до файла
$fileXml=dirname(__FILE__).DIRECTORY_SEPARATOR.'example.xml';

//Подготовка XML
$xml = new XMLWriter();
$xml->openURI($fileXml);
$xml->setIndent(true);

$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('Sinercom');

$xml->startElement('FileInfo');
	$xml->startAttribute('format');
	$xml->text('Sinercom');
	$xml->startAttribute('link');
	$xml->text('http://on-realty.com');
$xml->endElement();			

$xml->startElement('Announcements');

//Цикл, где может быть 50 тыс. записей
foreach($listAnnounce as $k => $announcement){
	$xml->startElement('Announcement');
	    $xml->startAttribute('id');
	    $xml->text($announcement->id);
	    $xml->startAttribute('id_estate');
	    $xml->text($announcement->id_estate);
	    $xml->startAttribute('id_building');
	    $xml->text($announcement->id_building);
            //Тут еще атрибутов 10
	$xml->endElement();
}

$xml->endElement();
$xml->endElement();
$xml->flush(true);
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322271
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В конце вот так
Код: php
1.
file_put_contents($fileXml, $xml->flush(true), FILE_APPEND);
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322344
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLineВ конце вот так
Код: php
1.
file_put_contents($fileXml, $xml->flush(true), FILE_APPEND);


откуда вы это взяли????
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322537
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автороткуда вы это взяли????

Примет в нете нашел - http://codeinthehole.com/writing/creating-large-xml-files-with-php/
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322540
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вопрос все равно мне кажется не в этом, а в большом объеме данных.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322576
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLineПримет в нете нашел - http://codeinthehole.com/writing/creating-large-xml-files-with-php/
говнокод

NewLineНу вопрос все равно мне кажется не в этом, а в большом объеме данных.
небольшой объём ))

$listAnnounce - он что - весь в памяти?
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322579
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил $listAnnounce - он что - весь в памяти?
Об этом как-то не думал.
Ну вообще да.
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322596
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewLine,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
$sql="SELECT * FROM mytbl";
$conn = new PDO( $connectionString, $user, $password);  
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   

$cmd = $conn->prepare($sql);  
$cmd->execute(); 

$s= new XMLWriter();
$s->openURI($fileName);
$s->startDocument();
$s->startElement('root');

while($row=$cmd->fetch(PDO::FETCH_ASSOC)){
$s->startElement('row');
foreach($row as $k=>$v){
     $s->startElement($k);
     $s->text($v);
     $s->endElement();
}
$s->endElement();
}

$s->endElement();
$s->endDocument();
$cmd->closeCursor();


не вижу проблем в скорости на сотне тысяч записей
...
Рейтинг: 0 / 0
Формирование большого файла XML средствами PHP
    #39322672
NewLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилне вижу проблем в скорости на сотне тысяч записей
Да отработало 30 тыс. записей без проблем за 40 сек.
Даже нагрузка на серваке не показалась.

Спасибо.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Формирование большого файла XML средствами PHP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]