Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Формирование большого файла XML средствами PHP / 19 сообщений из 19, страница 1 из 1
05.10.2016, 14:33
    #39321066
NewLine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
Добрый день.

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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

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


Чтоб память очищалась.
...
Рейтинг: 0 / 0
06.10.2016, 15:42
    #39322039
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
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
06.10.2016, 16:57
    #39322149
NewLine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
Ну да, вроде 20 тыс. записей он протянул.
Но если больше, все равно какая-то оптимизация нужна.

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

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


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

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

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

$listAnnounce - он что - весь в памяти?
...
Рейтинг: 0 / 0
07.10.2016, 11:30
    #39322579
NewLine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
Изопропил $listAnnounce - он что - весь в памяти?
Об этом как-то не думал.
Ну вообще да.
...
Рейтинг: 0 / 0
07.10.2016, 11:45
    #39322596
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
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
07.10.2016, 12:32
    #39322672
NewLine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование большого файла XML средствами PHP
Изопропилне вижу проблем в скорости на сотне тысяч записей
Да отработало 30 тыс. записей без проблем за 40 сек.
Даже нагрузка на серваке не показалась.

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


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