Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Парсинг большого XML файла (10 мб)


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

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

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


Автор: arto 20.1.2010, 16:10
XML::Parser

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


Автор: AlexanderI 20.1.2010, 17:47
А можете привести какой-нибудь не сложный пример парсинга с XML::Parser.
Что-то никак не могу разобраться с ним.  Примеры которые приводятся вместе с модулем читал, и perldoc тоже :(

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

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

Автор: mvsgt 20.1.2010, 20:26
Может там сегодня 10 мегабайт, а со временем будет 100. Лучше перестраховаться.

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

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

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

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


Автор: arto 20.1.2010, 21:08
интересно, каким образом вы подвесили XML::Parser на 1M ?

Автор: AlexanderI 20.1.2010, 21:36
arto, прям вот так, только не 1 мб, а 9 мб.

Код

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


Вот я думаю, не может же такое быть чтобы ни один парсер не справился, может в другую сторону копать надо ...

Автор: arto 20.1.2010, 22:08
# 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
#

Автор: shamber 20.1.2010, 22:14
что-то тут не так. я 70 метровые XML::Twig без проблем обрабатывал smile. Может у вас БД вешает все?

Автор: arto 21.1.2010, 00:46
по поводу 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 за одну минуту.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)