1

Perl でかなり基本的な webapp を作成し、.xml を使用して XML ファイルを処理しますXML::TwigXML::Twigこれらの XML ファイルはかなり大きく複雑なので、「一度にすべてをロードする」方法ではなく、意図的にチャンクごとに変更する方法を使用しています。

ただし、チャンク方式を使用している場合でも、大きな XML ドキュメントを読み込むと、この Web アプリケーションは完全にクラッシュして停止します。Web アプリケーションが 1and1.co.uk との共有サーバーでホストされており、Apache エラー ログ ファイルが表示されないため、これがなぜ起こったのかについての手がかりを得ることができませんでした。呼び出しをeval{}ブロックにラップしても、死ぬのをキャッチできませんでした。厄介なことに、自宅の開発サーバーでは問題なく動作するため、問題を再現できませんでした。

それを機能させるために、parse()メソッドを使用して XML 全体を含むスカラーを渡す代わりに、XML をファイルに書き込んで代わりに使用するように変更しましたparsefile( $filename )。その変更を行ったところ、うまくいきました。

私はこれに少し混乱しています.Googleの驚異を介して、parsefile()実際にそれがより効率的であるかどうかを調べようとしましparse()たが、何も見つかりませんでした. 誰かがたまたま知っていますか?

4

2 に答える 2

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, $@);
  }

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 = $@;
  close(FILE);
  die $err if $err;

  return unless defined wantarray;
  return wantarray ? @ret : $ret;
}
于 2012-03-11T01:09:09.780 に答える
-1

1 と 1 を使用すると、Apache ログ ファイルにアクセスできると確信しています。Apache ログ ファイルは、CGI や Web アプリなどのデバッグに不可欠なツールだからです。彼らに大声を出して、それを行う方法を尋ねてください。

XML ファイルが大きい場合XML::Twig、チャンク モードで使用するポイントが損なわれます。また、メモリ クォータを超えているため、アプリがサーバー上で失敗している可能性もあります。繰り返しになりますが、Web ホスティング会社に電話すると、これが事実であるかどうかがわかります。

そもそも XML はどのようにしてメモリに取り込まれるのでしょうか? XML ファイルからメモリに丸呑みしている場合は、修正をそのままにXML::Twigして、ファイルから直接読み取ることができます。リモート URL から XML をフェッチする場合は、ローカル ファイルへのデータのフェッチを回避XML::Twigするメソッドがあることに注意してください。parseurl他に有力な情報源が思い浮かばないので、説明する必要があります。

于 2012-03-10T21:26:34.207 に答える