2011-07-12 4 views
0

私は変数とundefをグローバル化しようとしましたが、unixのデータセグメントスペースを増やして変数をローカライズしましたが、私は約750ファイルを処理する必要があります。誰でも助けてもらえますか?ありがとう。私は文字列にファイル全体を読むことが問題であるかもしれないことを知っています。しかし、私は他の方法についてはわかりません。しかし、私は文字列をグローバルとして宣言し、それを= ""とします。次回の反復でメモリを解放しますか?perlメモリのメッセージ処理がちょうど64 XMLファイルそれぞれ2MB - unix

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 
    } 
} 
} 

}}

+1

これは完全なコードではありません。私にとってはコンパイルできません。エラーが多すぎます。 'switch/case'、本当ですか?それも機能しますか?キーワードは「与えられた」と「いつ」なのかと思った。 – TLP

+1

別の「本当に?ここで大きなコードブロックに 'eval'を使用しています。サブルーチンを使用します。 –

+1

Davidと同意します。このコードは混乱しています。変数が多すぎる、グローバルが多すぎる、奇妙なことが多すぎる。何らかの理由で 'eval'を使用してサブ変数内にグローバル変数を設定しています。スコープを制限する代わりにグローバル変数でundefを使用します。そしてあなたは厳密に使っているようには見えません。そうでなければ '$ src'は他のところで定義されています。私の助言は:適切なプログラミング技術を使用して、このコードを出して新しいものを書くことです。 – TLP

答えて

3

まず第一に、スタイルのコメントは有用で正確であり、助けになります。しかし、1.5GbのXMLを処理する必要がある場合は、メモリを少しずつ管理する必要があります。

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

DOMツリーの処理が終了したら、主にdisposeメソッドを呼び出してDOMツリーを削除する必要があります。 XML::DOMのポッドの概要では、これはかなり明確です。あなたの記憶の問題を解決するだけで十分です。 (技術的には、DOMツリーは周期的な参照を含む傾向があり、単純な参照カウントガベージコレクションでは自動的に管理されません。十分ではありません)

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

2

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

関連する問題