我已经用Perl编写了一个相当基本的Web应用程序,它使用XML::Twig
来处理XML文件。这些XML文件相当大且复杂,所以我故意使用块大小为XML::Twig
的块而不是“一次加载”方法。XML :: Twig:parsefile()比parse()更高效吗?
但是,如果我加载大型XML文档,即使使用分块方法,此webapp也会完全崩溃并死亡。我无法得到任何线索,为什么发生这种情况,因为webapp托管在1and1.co.uk的共享服务器上,而且我看不到Apache错误日志文件。即使将电话打包在eval{}
区块中,我也无法从死亡中捕捉到它。令人烦恼的是,它在我家的开发服务器上工作正常,所以我不能再现问题。
为了得到它的工作,我做了一个改动,以便代替使用parse()
方法并传入包含整个XML的标量,我将XML写入文件,然后使用parsefile($filename)
代替。当我做出改变时,它就起作用了。
我对此有点困惑,tbh,并且我试图通过Google的奇迹发现是否确实更有效,parse()
,但未能找到任何东西。有人碰巧知道吗?
的1and1不给访问错误日志文件。我没有看到如何解析块中的XML会破坏使用XML :: Twig的重点,因为这是使用它的关键。 1and1不会给我额外的记忆;地狱,这些人拒绝在他们的debian服务器上部署标准软件包(比如libxml-twig-perl!)。至于XML,它从URL下载并存储到磁盘;这需要发生,因为XML太大了,当服务器尝试将它保存在内存中时,服务器崩溃时会出现大量(+ 5MB)XML文件 - 我不认识你。 – Kenny 2012-03-11 09:56:49
然后你有我的同情心:限制访问错误日志是奇怪的!我的意思是将整个XML文件保存在内存中会损害块处理的重要性,因为您已经使用了大量内存。我以为你将内存中的XML转储到一个文件中,并使用'XML :: Twig'来处理它。由于它来自远程URL,因此可以避免将其保存在本地,并使用'parseurl'而不是'parsefile'。 – Borodin 2012-03-11 14:11:17