Я написал довольно простой 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()
, но не смог найти что-либо. Кто-нибудь знает?
1and1 не дают доступа к ошибке журнальный файл. Я не вижу, как разбор XML в кусках испортил смысл использования XML :: Twig, так как в этом смысл его использования. 1 и 1 не просто дают мне дополнительную память; черт возьми, эти ребята отказываются развертывать стандартные пакеты на своих серверах debian (например, libxml-twig-perl!). Что касается XML, он загружается с URL-адреса и сохраняется на диске; это должно произойти по мере того, как XML настолько велик, что при сбое в работе сервера с большими (+ 5 МБ) файлами происходит сбой сервера. – Kenny
Тогда у вас есть мои симпатии: ограничение доступа к журналу ошибок причудливо! Я имел в виду, что хранение всего XML-файла в памяти портит точку обработки chunk, поскольку вы уже использовали огромный объем памяти. Я думал, вы сбрасываете свой XML-файл в памяти и используете «XML :: Twig» для его обработки.Поскольку он исходит из удаленного URL-адреса, вы можете избежать его локально в целом и использовать 'parseurl' вместо' parsefile'. – Borodin