0

変数とundefをグローバル化し、unixのデータセグメントスペースを増やし、変数をローカライズしようとしましたが、それでも同じエラーが発生します。約750個のファイルを処理する必要があります。誰か助けてもらえますか?ありがとう。ファイル全体を文字列に読み込むことが問題になる可能性があることはわかっています。しかし、他の方法はわかりません。しかし、それでも私は文字列をグローバルとして宣言し、それを=""にします。次の反復でメモリを解放する必要がありますか?

foreach my $file_name (@dir_contents) 
{

if(-f "rawdata/$file_name")
{
$xmlres="";
eval {

while(<FILE>)
{
    $xmlres.=$_;
}
close FILE;


 ***$doc=$parser->parsestring($xmlres);***  
foreach my $node($doc->getElementsByTagName("nam1"))
{
    foreach my $tnode($node->getElementsByTagName(("name2")))
    {
        //processing
    }
}
}

}}

4

2 に答える 2

3

まず第一に、スタイル コメントは便利で正しく、役に立ちます。ただし、1.5Gb の XML を処理する必要がある場合は、メモリをもう少し適切に管理する必要があります。

XML::DOM使用したスペースを自動的に解放しません。これは時代遅れの兆候であり、新しいモジュールはメモリ管理がはるかに優れており、これを自動的に行う傾向があります (私もこれを行う を使用XML::LibXMLしており、強くお勧めします)。

dispose主に、DOM ツリーの処理が終わったら、メソッドを呼び出して DOM ツリーを消去する必要があります。これは、 のポッドの概要でかなり明確ですXML::DOM。メモリの問題を解決するには、呼び出すだけで十分な場合があります。(技術的には、DOM ツリーには循環参照が含まれる傾向があり、これらはガーベッジ コレクションをカウントする単純な参照では自動的に管理されません。Perl は弱参照を使用して支援しましたが、これはXML::DOM完全に統合されていないようです。単にツリーの参照を解除することはできません。足りる。)

私は確かに他の場所でスタイルを改善したいと思います. その他のスタイルの問題。主に例外処理に使用しているように見えるので、Try::Tinyを処理しようと思います。eval {}また、いくつかの悪い経験から、確かな日付/時刻パーサーを使用することは常に良い考えであることがわかりました。にあるものを使用していますDateTime::Format::*。日付と時刻の解析には多くの奇妙なケースがあり、これによりコード行が節約され、処理の信頼性が向上します。

于 2011-07-12T13:45:32.737 に答える
2

XML::DOM は古くて制限があります (言うまでもなく、もう維持されていないと思います)。XML::LibXML を試してみてください。これは非常によく似ています (DOM も実装しています)。ただし、より高速で、よりメモリを節約し、より強力で (完全な XPath 実装...)、維持されています...

于 2011-07-12T11:12:51.983 に答える