さて、CGIですが、やっぱりダメです。メモリ不足でエラーが出ます。オブジェクト指向にしたせいか、より早くメモリを消費するようになってしまいました。
とはいえ、いろいろ試してみると、それだけというわけでもないような…。たとえば、以下のコードをmain.pl(どのページでもまず呼び出すスクリプト)に書き込んでみます。
my $a = 'a' x (1024 * 1024 * 102);
当然、100MB以上のメモリが確保されるわけですが、なんのエラーも起こりません。最後に4を加えて1GB確保してしまうとさすがに落ちますが、これは大丈夫です。
で、問題のページを表示する部分を呼んでみると、エラーが起きた時点では3300KB消費。メモリ不足ではないようです。となると、やっぱりどこか…。
そういえば、Perlのガベージコレクションは、DelphiのString型などと同じく、参照カウント制*1で動いているそうですね、これの長所は、実装が簡単なことですが、他のやり方と比べてまんべんなく処理が重くなり、また処理がループしたときに対処できなくなるおそれがあるとのこと。ということは、これが問題なのでしょうか?
Delphiではそういう問題起こった記憶ないんですがねぇ…。
*1:参照されればポイントを+1、参照が破棄されたら-1、ポイントが0になった時点で解放