2012-03-10 5 views
1

私はかなり基本的な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の驚異を突き止めようとしました。誰か知っているのですか?

答えて

-1

私はあなたとあなたのようなCGIやWebアプリケーションをデバッグするための重要なツールであるため、1と1はApacheログファイルにアクセスできると確信しています。彼らに叫びを与え、それをどうやって行うのか尋ねる。

XMLファイルが大きい場合は、チャンクモードでXML::Twigを使用する点が壊れます。また、メモリクォータを超えているため、あなたのアプリがサーバー上で失敗している可能性があります。再度、あなたのウェブホスティング会社への電話は、これが本当であるかどうかをあなたに伝えます。

まず、XMLはどのようにメモリに格納されますか? XMLファイルからメモリにスラップしている場合はそのまま修正をそのまま残し、ファイルから直接読み取るにはXML::Twigを取得してください。リモートURLからXMLをフェッチする場合は、XML::Twigにはparseurlメソッドがあり、データをローカルファイルにフェッチしないように注意してください。私は別の可能性のある情報源を考えることができないので、説明しなければなりません。

+0

1and1エラーへのアクセス権を与えていませんログファイル。私はチャンクでXMLを解析することが、XML :: Twigの使用のポイントを駄目にしているのを見ていません。 1と1だけ私に余分なメモリを与えることはありません。これらの人は、debianサーバ(libxml-twig-perlなど)に標準パッケージをデプロイすることを拒否します。 XMLに関しては、URLからダウンロードされてディスクに格納されます。これはXMLが非常に大きいために発生する必要があります。サーバーは大きな(+ 5MB)XMLファイルをメモリに保持しようとするとクラッシュします。 – Kenny

+0

あなたは私の同情があります:エラーログへのアクセスを制限するのは奇妙です! XMLファイル全体をメモリに保存するということは、すでに膨大な量のメモリを使用していたため、チャンク処理のポイントを損なうことになります。私はあなたのメモリ内のXMLをファイルにダンプし、そこから 'XML :: Twig'を使って処理していると思っていました。リモートのURLから来ているので、それをローカルに保持することを避け、 'parsefile'の代わりに' parseurl'を使います。 – Borodin

2

ソースを見てください。彼らは同じことです。 XML::Twigparsefile

だけ拡張XML::Parser::parsefile(スーパークラス)である:

XML::Parser
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]); 
    } 

parsefileparse単なるラッパーです:

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

私はあなたの答えを誤解しているかもしれませんが、それはXML :: Twigのparsefile()とparse()を比較していませんか? XML :: Parserの2つのメソッドを比較していますか?そして、1つが確かに他のものを包むラッパーであるとしましょう... 1つのクラッシュと同じ大規模なXMLファイルを持つ別の作業はなぜですか?これは私を混乱させるものです。 – Kenny

+0

トップコードはXML :: Twigのものです。下のコードは、スーパークラスであるXML :: Parserのコードです。あなたは私たちにいかなるコードも示していません。あなたは良いことではない他のすべてのことをしている可能性があります。 –

関連する問題