| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 мб.
Вот я думаю, не может же такое быть чтобы ни один парсер не справился, может в другую сторону копать надо ... |
| Автор: 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 без проблем обрабатывал |
| Автор: 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 за одну минуту. |