GC
Perlのガベージコレクタは、参照カウント方式なので、相互参照してるようなオブジェクトは使われなくなっても解放してくれない。運悪く'Out of memory!'なんて表示がでたら、シェルスクリプトでも使って、処理の1ステップごとにPerlを起動して、後で個々のステップでの出力を結合するようにした方が良い。自分の場合、こんな感じの処理をやっててメモリ不足になりました。
while(my $file = fileIterator->next) { my $parser = HogeParser->new($file); my $hogeIterator = $parser->iterator; ### 内部で構成要素の双方向リンクドリストをつくる while (my $hoge = $hogeIterator->next) { ### tekitou print $hoge->toString, "\n"; } }
で、大体2ファイル目に入ったあたりで、メモリ不足になると。ステップごとにPerlを起動して対処するといったのは、次のようなこと。
### parse_sub.pl ### 1ステップ分の処理を行うスクリプト my $parser = HogeParser->new($ARGV[0]); my $hogeIterator = $parser->iterator; while (my $hoge = $hogeIterator->next) { ### tekitou print $hoge->toString, "\n"; }
### parse_main.pl ### メインのスクリプト my $result = ''; foreach (@ARGV) { $result .= `perl parse_sub.pl $_`; }
と書いておいていうのもなんですが、これも面倒だったので、自分の場合は双方向リストを使わない方向で修正してます・・・。