2012-03-10 2 views
1

Я написал довольно простой webapp в Perl и обрабатывает XML-файлы, используя XML::Twig. Эти XML-файлы довольно большие и сложные, поэтому я намеренно использую кусок по переменной chunk от XML::Twig, а не по методу «загрузить все сразу».XML :: Twig: является parsefile() более эффективным, чем parse()?

Однако этот webapp полностью падает и умирает, если я загружаю в большой XML-документ даже при использовании метода chunking. Я не мог понять, почему это происходит, потому что webapp размещен на общем сервере с 1and1.co.uk, и я не вижу файл журнала ошибок Apache. Даже когда вы завершаете вызовы в блоке eval{}, я не мог уловить его от смерти. Раздражающе, он отлично работает на моем сервере разработки дома, поэтому я не смог воспроизвести проблему.

Чтобы заставить его работать, я внесла изменения, чтобы вместо использования метода parse() и передачи в скаляр, содержащий весь XML, я написал XML в файл, а затем использовал parsefile($filename). Когда я сделал это изменение, это сработало.

Я немного смущен этим, tbh, и я попытался выяснить чудо Google, если parsefile() действительно более эффективен, чем parse(), но не смог найти что-либо. Кто-нибудь знает?

ответ

-1

Я уверен, что 1 и 1 позволяют получить доступ к файлу журнала Apache, поскольку он является важным инструментом для отладки CGI и веб-приложений, таких как ваши. Дайте им крик и спросите их, как это сделать.

Если ваши файлы XML большие, то это портит точку использования XML::Twig в режиме куска. Также кажется вероятным, что ваше приложение терпит неудачу на сервере, потому что оно превысило квоту памяти. Опять же, звонок в вашу веб-хостинговую компанию расскажет вам, так ли это.

Как ваш XML попадает в память в первую очередь? Если вы вложили его в память из файла XML, просто оставите это исправление, и получите XML::Twig, чтобы читать непосредственно из файла. Если вы извлекаете XML из удаленного URL-адреса, помните, что XML::Twig имеет метод parseurl, который позволит избежать сбора данных в локальный файл. Я не могу думать о другом вероятном источнике, поэтому вам придется объяснять.

+0

1and1 не дают доступа к ошибке журнальный файл. Я не вижу, как разбор XML в кусках испортил смысл использования XML :: Twig, так как в этом смысл его использования. 1 и 1 не просто дают мне дополнительную память; черт возьми, эти ребята отказываются развертывать стандартные пакеты на своих серверах debian (например, libxml-twig-perl!). Что касается XML, он загружается с URL-адреса и сохраняется на диске; это должно произойти по мере того, как XML настолько велик, что при сбое в работе сервера с большими (+ 5 МБ) файлами происходит сбой сервера. – Kenny

+0

Тогда у вас есть мои симпатии: ограничение доступа к журналу ошибок причудливо! Я имел в виду, что хранение всего XML-файла в памяти портит точку обработки chunk, поскольку вы уже использовали огромный объем памяти. Я думал, вы сбрасываете свой XML-файл в памяти и используете «XML :: Twig» для его обработки.Поскольку он исходит из удаленного URL-адреса, вы можете избежать его локально в целом и использовать 'parseurl' вместо' parsefile'. – Borodin

2

Посмотрите на источник. Это одно и то же.

В XML::Twigparsefile просто расширенный XML::Parser::parsefile (суперкласс):

sub parsefile 
    { my $t= shift; 
    if(-f $_[0] && ! -s $_[0]) { return _checked_parse_result(undef, "empty file '$_[0]'"); } 
    $t= eval { $t->SUPER::parsefile(@_); }; 
    return _checked_parse_result($t, [email protected]); 
    } 

В XML::Parser, parsefile просто оберткой parse:

sub parsefile { 
    my $self = shift; 
    my $file = shift; 
    local(*FILE); 
    open(FILE, $file) or croak "Couldn't open $file:\n$!"; 
    binmode(FILE); 
    my @ret; 
    my $ret; 

    $self->{Base} = $file; 

    if (wantarray) { 
    eval { 
     @ret = $self->parse(*FILE, @_); 
    }; 
    } 
    else { 
    eval { 
     $ret = $self->parse(*FILE, @_); 
    }; 
    } 
    my $err = [email protected]; 
    close(FILE); 
    die $err if $err; 

    return unless defined wantarray; 
    return wantarray ? @ret : $ret; 
} 
+0

Возможно, я не понимаю ваш ответ, но это не сравнение parsefile() и :: parsefile()? Это сравнение двух методов в XML :: Parser? И скажем, что на самом деле это всего лишь обертка вокруг другого ... почему один сбой и другая работа с тем же большим XML-файлом? Вот что меня смущает. – Kenny

+0

Верхний код от XML :: Twig. Нижний код - это XML :: Parser, суперкласс. Вы не показали нам никакого кода. Вы могли бы делать все, что нехорошо. –

Смежные вопросы