Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг большого XML файла (10 мб), для записи данных в базу данных 
:(
    Опции темы
AlexanderI
Дата 20.1.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Здравствуйте.
Пытаюсь парсить XML файл 10 мб модулем XML::Simple, не получается, похоже файл слишком большой, не получилось.
Почитав форум, попробывал использовать XML::Twig. Тоже не получилось.

Подскажите как можно пропарсить XML файл для дальнейшей записи данных в базу ?
Может както разбить XML файл на несколько частей ?

А может кто покажет примерный пример как это сделать ?


--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
arto
Дата 20.1.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



XML::Parser
PM MAIL ICQ   Вверх
ginnie
Дата 20.1.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Сначала использовал XML::Twig, потом переделал на XML::Parser. Очень непривычно, но скорость оправдывает затраты на разработку.




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AlexanderI
Дата 20.1.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



А можете привести какой-нибудь не сложный пример парсинга с XML::Parser.
Что-то никак не могу разобраться с ним.  Примеры которые приводятся вместе с модулем читал, и perldoc тоже :(
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
sir_nuf_nuf
Дата 20.1.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



10 Мб - это не очень много.
Примерно 30 - 40 Мб памяти если разбирать с помощьбю DOM.
Поэтому рекомендую XML::Simple или XML::LibXML::Simple

Хотя если память дико ограничена...


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
mvsgt
Дата 20.1.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Может там сегодня 10 мегабайт, а со временем будет 100. Лучше перестраховаться.
PM MAIL   Вверх
AlexanderI
Дата 20.1.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Пробую всё делать под Windows c установленным Denwer 3.
Может мне нужно настроить Denwer чтобы он выделял больше памяти ?

Через XML::Simple - зависает всё.
Через XML::Twig - зависает после вывода ~ 308 килобайт
Через XML::Parser - обрабатывает кое-как файл 1 мб. Если отрабатывать 9 мб файл, то тоже подвисает.

Вот перебирать с помощью Dom я не пробывал. Где можно прочитать про это ?

Может у когото есть исходники обработки большого файла ? Может при обработки большого файла есть какие-то особенности ?


--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
arto
Дата 20.1.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



интересно, каким образом вы подвесили XML::Parser на 1M ?
PM MAIL ICQ   Вверх
AlexanderI
Дата 20.1.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



arto, прям вот так, только не 1 мб, а 9 мб.

Код

  $ff = new XML::Parser(Style => 'Debug');
  my $pars =  $ff->parsefile('file.xml');
  print Dumper($pars);


Вот я думаю, не может же такое быть чтобы ни один парсер не справился, может в другую сторону копать надо ...
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
arto
Дата 20.1.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -le 'print "<document>"; foreach (@ARGV) { print "<row number=\"$_\">@{[rand 1024]}</row>"; } print "</document>";' {1..1000000} > /opt/tmp/test.xml
# ls -lh /opt/tmp/test.xml
-rw-r--r--. 1 arto arto 42M 2010-01-20 20:51 /opt/tmp/test.xml
# time perl -MXML::Parser -e '$p = new XML::Parser (''Style'' => "Debug"); $p->parsefile ($ARGV[0])' /opt/tmp/test.xml |& wc -l
4000476
Real: 101.66s User: 66.16s System: 18.85s Percent: 83%% Cmd: perl -MXML::Parser -e  /opt/tmp/test.xml 2>&1
Real: 101.65s User: 2.37s System: 12.38s Percent: 14%% Cmd: wc -l
#
PM MAIL ICQ   Вверх
shamber
Дата 20.1.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



что-то тут не так. я 70 метровые XML::Twig без проблем обрабатывал smile. Может у вас БД вешает все?
PM MAIL Jabber   Вверх
arto
Дата 21.1.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



по поводу 9М и XML::Parser:

# perl -le 'print "<document>"; foreach (@ARGV) { print "<row number=\"$_\">@{[rand 1024]}</row>"; } print "</document>";' {1..5000000} >| /opt/tmp/test.xml
# ls -lh /opt/tmp/test.xml
-rw-r--r--. 1 arto arto 213M 2010-01-20 23:39 /opt/tmp/test.xml
# time perl -MXML::Parser -e 'my $p = new XML::Parser (Handlers => { Start => sub { },End => sub { }, Char => sub { } }); $p->parsefile ($ARGV[0])' /opt/tmp/test.xml
Real: 60.30s User: 51.01s System: 1.29s Percent: 86%% Cmd: perl -MXML::Parser -e  /opt/tmp/test.xml
#

213M за одну минуту.  
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.