私はかなり基本的なWebアプリケーションをPerlで書いており、XML::Twig
を使ってXMLファイルを処理しています。これらのXMLファイルはかなり大きく、複雑なので、私は意図的にチャンクをXML::Twig
という塊のバリエーションで使用しています。XML :: Twig:parsefile()はparse()よりも効率的ですか?
しかし、チャンク方式を使用していても、大規模なXMLドキュメントを読み込んだ場合、このWebアプリケーションは完全にクラッシュして終了します。 webappが1and1.co.ukの共有サーバー上でホストされているため、Apacheのエラーログファイルが表示されないため、なぜこれが起こったのかについての手がかりを得ることができませんでした。 eval{}
ブロックで呼び出しをラップするときでも、私はそれを捕まえることができませんでした。うんざりすると、自宅の開発サーバーで正常に動作するため、問題を再現できませんでした。
parse()
メソッドを使用し、XML全体を含むスカラーを渡す代わりに、XMLをファイルに書き込んだ後、代わりにparsefile($filename)
を使用するように変更しました。私がその変更を行ったとき、それは働いた。
私はちょっと混乱しているのですが、私はparsefile()
が実際にはparse()
の方が効率的ですが、何も見つけられなかったかどうかGoogleの驚異を突き止めようとしました。誰か知っているのですか?
1and1エラーへのアクセス権を与えていませんログファイル。私はチャンクでXMLを解析することが、XML :: Twigの使用のポイントを駄目にしているのを見ていません。 1と1だけ私に余分なメモリを与えることはありません。これらの人は、debianサーバ(libxml-twig-perlなど)に標準パッケージをデプロイすることを拒否します。 XMLに関しては、URLからダウンロードされてディスクに格納されます。これはXMLが非常に大きいために発生する必要があります。サーバーは大きな(+ 5MB)XMLファイルをメモリに保持しようとするとクラッシュします。 – Kenny
あなたは私の同情があります:エラーログへのアクセスを制限するのは奇妙です! XMLファイル全体をメモリに保存するということは、すでに膨大な量のメモリを使用していたため、チャンク処理のポイントを損なうことになります。私はあなたのメモリ内のXMLをファイルにダンプし、そこから 'XML :: Twig'を使って処理していると思っていました。リモートのURLから来ているので、それをローカルに保持することを避け、 'parsefile'の代わりに' parseurl'を使います。 – Borodin