Обработка PHP 4 большого XML файла и запихивание данных в базу MySQL

  • Автор темы Vladimir Vorono
  • Дата начала

Vladimir Vorono

Guest
Обработка PHP 4 большого XML файла и запихивание данных в базу MySQL

Каким способом, и вообше возможно ли, довольно быстро обработать PHP файл XML размером 280 Мб, и данные из него запихнуть в базу SQL.

Интересен не код, а алгоритм. Возможно ли чтение файла по кусочкам, а не сразу его запихивание в базу?
 

shp

Guest
Алгоритм - проще простого. Назначаешь фукции-обработчики событий, в этих функциях составляешь запросы из полученных при парсинге данных, при насуплении какого-то события (например, при появлении определенного закрывающего тэга) эти запросы выполняешь.
Файл тебе все равно придется разбивать. Или ты собираешься перед парсингом редактировать текстовик размером 280 Мб в текстовом редакторе? У меня Ворд сильно глючил уже при обработке файла 15 Мб. Где ты, кстати, откопал такой огромный файл? Что там за информация такая?
 

tony2001

TeaM PHPClub
Лично мне фраза "быстро обработать PHP файл XML размером 280 Мб" кажется бессмысленной.
Такой объем данных, особо в XML *быстро* ничем не обрабатывается.

>Или ты собираешься перед парсингом редактировать текстовик размером 280 Мб
>в текстовом редакторе? У меня Ворд сильно глючил уже при обработке файла 15
>Мб.
я вынужден разочаровать - в мире есть много редакторов, кроме Ворда.
и многие из них работают и с бОльшими объемами.
 

neko

tеam neko
быстрее будет поставить на ночь конвертацию в инсерты, а потом залить
если в mysql есть возможность вставки из какого-нибудь бинарного формата то будет еще быстрее
 

shp

Guest
Автор оригинала: tony2001
я вынужден разочаровать - в мире есть много редакторов, кроме Ворда.
и многие из них работают и с бОльшими объемами.
Спасибо, что просвятил. А то я не знал.
Я специально не называл никаких других, потому что эта ветка могла бы перерости в обсуждение редакторов, которые лучше работают с файлами размером 280 Мб.
Автор оригинала: neko
быстрее будет поставить на ночь конвертацию в инсерты, а потом залить
если в mysql есть возможность вставки из какого-нибудь бинарного формата то будет еще быстрее
А чем еще кроме PHP-скрипта можно выполнять конвертацию XML-я в инсерты? Просто я с похожей задачей уже сталкивался и написал PHP-скрипт. Был вроде у меня какой-то SQL-клиент, который позволял такое делать, но он глючил.
 

shp

Guest
А чем можно выполять xslt-преобразования, кроме как скриптом? Браузер может подвиснуть, если данных много, как у этого чела.
 

confguru

ExAdmin
Команда форума
Vladimir Vorono

Пхп такие файлы не обрабатывают..
Это все равно что забивать гвозди микроскопом.
Для начала надо превратить этот файл в CSV
потом втянуть через консоль.

P.S. Но комп должен быть не слабым.
 

shp

Guest
Автор оригинала: Vladimir Vorono
Каким способом, и вообше возможно ли, довольно быстро обработать PHP файл XML размером 280 Мб, и данные из него запихнуть в базу SQL.
Вообще-то, есть еще один способ. С помощью проги с поддержкой регулярных выражений превратить исходный файл в CSV- или SQL-файл.
 

Vladimir Vorono

Guest
Originally posted by admin
Vladimir Vorono

Пхп такие файлы не обрабатывают..
Это все равно что забивать гвозди микроскопом.
Для начала надо превратить этот файл в CSV
потом втянуть через консоль.

P.S. Но комп должен быть не слабым.
Это все понятно, но задача как раз стоит в том, что бы сделать возможной обработку файла такого размера на слабой машине (200 Мгц, 260 памяти), пускай медленно, но главное что бы обрабатывался. Хоть 5 дней, но без сбоев.

Ответ в виде "Невозможно" мне к сожалению не подходит, у меня есть поставленная задача и мне ее, к сожалению, необходимо решить.

А чем такие файлы обрабатывают? На мой взгляд, 280 Мб в настоящее время не является супер гигантским размером.

Меня уже замучали этим сравнением с микроскопом:

Parser3 - не для этого.
PHP - не для этого.
Perl - тоже "типа" не очень подходит.

А задача (алгоритм) системы нипель: прочитал строчку, взял значение, положил в базу. Все. Так нет, ничто с этим справиться не может :)
 

Kivsiak

Новичок
Кроме пхп есть еще множество языков, я бы к python+PyXML рекомендовал, если из скриптовых. А так почему бы на с/c++ или Delphy не написать? В чем то, и намного быстрее.

-~{}~ 13.02.05 12:40:

Приведи кусок документа, пару узлов к примеру
 

Vladimir Vorono

Guest
Автор оригинала: Kivsiak
Кроме пхп есть еще множество языков, я бы к python+PyXML рекомендовал, если из скриптовых. А так почему бы на с/c++ или Delphy не написать? В чем то, и намного быстрее.

-~{}~ 13.02.05 12:40:

Приведи кусок документа, пару узлов к примеру
Вот, пожалуйста. Но это малая часть. И документ не весь такой структуры. Если вам это поможет - документ содержит XML образ базы 1C 8.0

Только есть одно требование, обработчик обязательно должен выполняться на сервере. Никаких локальных машин с дальнейшей переливкой дампа туда/сюда.

Что есть много других языков, это мне известно :), но к сожалению возможности моего мозга ограничены временными рамками :) Поэтому изначально я исходил из попыток реализации на языках, с которми я знаком в той или иной степени. Судя по всему вы правы, и необходимо будет рассмотреть варианты обработки файла средствами C/C++

<InformationRegisterRecordSet.ЗначенияСвойствОбъектов>
<Filter>
<Объект xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.Номенклатура">df674856-7e75-11d8-9875-00a0c540a7b8</Объект>
<Свойство>ba69074e-7b29-11d8-9867-00a0c540a7b8</Свойство>
</Filter>
<Records>
<Record>
<Объект xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.Номенклатура">df674856-7e75-11d8-9875-00a0c540a7b8</Объект>
<Свойство>ba69074e-7b29-11d8-9867-00a0c540a7b8</Свойство>
<Значение xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.ЗначенияСвойствОбъектов">ba69074f-7b29-11d8-9867-00a0c540a7b8</Значение>
<МодифиР>true</МодифиР>
<МодифиЛ>true</МодифиЛ>
</Record>
</Records>
</InformationRegisterRecordSet.ЗначенияСвойствОбъектов>
<InformationRegisterRecordSet.ЗначенияСвойствОбъектов>
<Filter>
<Объект xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.Номенклатура">4fb9f761-7cda-11d9-9ae8-00a0c540a7b8</Объект>
<Свойство>708e1823-8421-11d8-988b-00a0c540a7b8</Свойство>
</Filter>
<Records>
<Record>
<Объект xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.Номенклатура">4fb9f761-7cda-11d9-9ae8-00a0c540a7b8</Объект>
<Свойство>708e1823-8421-11d8-988b-00a0c540a7b8</Свойство>
<Значение xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.ЗначенияСвойствОбъектов">03969906-9b80-11d8-98cc-00a0c540a7b8</Значение>
<МодифиР>true</МодифиР>
<МодифиЛ>true</МодифиЛ>
</Record>
</Records>
</InformationRegisterRecordSet.ЗначенияСвойствОбъектов>
 

Фанат

oncle terrible
Команда форума
особенно умиляет соотношение 280 - 260.
как нарочно подбирали :)

-~{}~ 13.02.05 13:18:

здесь, как мне кажется, привильнее танцевать от структуры БД, в которую этто заливается...
 

shp

Guest
Автор оригинала: Vladimir Vorono
Это все понятно, но задача как раз стоит в том, что бы сделать возможной обработку файла такого размера на слабой машине (200 Мгц, 260 памяти), пускай медленно, но главное что бы обрабатывался. Хоть 5 дней, но без сбоев.
А что за хостинг? Просто никто тебе не позволит выполнять твои скрипты неограниченное время, для PHP по дефолту устанавливают секунд 30.
Варианта два: первый - написать скрипт, который выполнит задачу за отведенное время (это будет непросто с учетом твоих системных ресурсов :).
А проще всего будет обрабатывать не один файл размером 280 Мб, а много мелких (метров по 5-10). Если эти данные - образ базы, то разбивать на множество файлов можно автоматически на этапе экспорта базы в XML-файл (по идее, такая возможность при экспорте должна быть). Затем пишешь парсер на том же PHP (ну или на чем другом, если хочешь), который будет добавлять эти данные в базу. Причем, при каждом запуске скрипта будет выбираться и обрабатываться очередной файл из определенной директории (для того, чтобы уложиться в отведенное время выполнения скрипта). Конечно, никто тебя не заставляет запускать скрипт каждый раз ручками.
5 дней - это ты загнул. Вот реальный пример: XML-файл 3.7 Мб, 2977 insert-запросов к MySQL, Apache+WinXP. Время выполнения скрипта: 7 (семь!) секунд.
 

Vladimir Vorono

Guest
Автор оригинала: shp
А что за хостинг?
VDS хостинг. Так что по времени отлупов нет. Тем более не обязательно таймаут по HTTPD получать, можно запускать через shell скрипт (браузером) и по окончании получать
письмо на эл. почту что все типа ОК.

Во всяком случае у меня так реализована обработка небольших файлов - 10-20 Мб с помощью parser3.

Жопа основная в том, что все пытаются сначала загрузить файл целиком в память, а потом уже его анализировать. Вот как от этого избавиться...
 

Kivsiak

Новичок
Возможно тебе поможет 7 выпуск пхп инсайда, там статья об работе с 1с
 

confguru

ExAdmin
Команда форума
Какой смысл затягивать эти бесмысленные значения?

4fb9f761-7cda-11d9-9ae8-00a0c540a7b8
708e1823-8421-11d8-988b-00a0c540a7b8
03969906-9b80-11d8-98cc-00a0c540a7b8
true
true

P.S. Не перле можно написать для начала уборку лишних
тегов и получить что привел выше...
P.S.S. Я так понимаю v.8 уже стала как windows - будет требовать супер комьпьютеров бухгалтерам.. которые все равно будут тормозить при индексации..

Имхо мне кажется если убрать лишние теги - гонечный файл будет ~30мб :)

Короче - не понимая ваших бизнес процессов - трудно что-то советовать.. в свое время гоняли данные по всей мировой погоде (40 000городов) - все было на демонах и перле.
 

Vladson

Сильнобухер
Я был в такой ситуации и пробовал
забивать гвозди микроскопом
конечно удовольствия мало, но база на месте и данные целы а главное простота испослнения...
(а вот скорость не будет радовать это гарантирую, я конвертил правда не с ХМL но тоже в SQL и понял что на РНР это не самый быстрый вариант)
 

Orlis

Guest
1С вообще-то среда программирования, вместо хакерства с недокоментированной внутренней структурой базы лучше написать примитивный скрипт, который открывает копию конфигурации и конвертит все (или только необходимые)справочники и документы в CSV или DBF
 

slach

Новичок
Орлис, единственный дал полезный совет:

вместо того чтобы делать стандартную выгрузку в формате CommerceML всего говна, которое есть в 1C номенклатуре, проводках, справочниках и документах

не проще ли заплатить 1С программеру за 2-3 часа работы
чтобы они сделал выгрузку того что вам нужно в НУЖНОМ вам формате не перегружая файл избыточной информацией (1С прекрасно работает с MSXML и COM)
?

кроме того, при желании можно 1C саму заставить слать данные через XMLHTPP на php ваш скрипт... тоже вариант, хотя и менее надежный
насколько я в курсе оно XMLHTTP COM исключения не обрабатывает


2shd - уймитесь "молодой человек", по горячности вы столько глупостей говорите, что уже даже не смешно

2neko - ты тоже не быкуй...

Автору вопроса
какие именно данные вам нужны из этих 280 метров ?

влияете ли вы АДМИНИСТРАТИВНО на источних этих данных ??

или это независимое и не подконтрольное вам приложение (люди которые генерируют эти данные, вам не подконтрольны)??
какова структура базы данных в которую планируется импортировать данные ?

в принципе задачу можно решить на php + SAX парсере обычными xml_ функциями... повторяю МОЖНО, но нужно ли, зависит от ответов на приведенные мной вопросы
 
Сверху