今回複数の非常にたくさんのデータが入ったファイルをCoroとかでFurlを非同期に使いながらほげほげする・・・ってことをしたんだけど、その際わりとずーっと普通の動作をしてるのにどこかで突然使用メモリが倍々ゲームになる症状がでてしまった。

基本的にやってることはこう:
   my @files = @ARGV;
   foreach my $file (@files) {
      # use Coro::Semaphore and what not to limit the number of
      # simultaneous files being processed to < 5
      ... snip ...

      async_pool {
         while( my $line = <$fh> ) {
             do_furl_stuff( $line );
         }
      };
    }

で、まぁ多分async_poolしてるから、async_pool内でがっつり確保したメモリを解放してないとか、そういう理由な気がするんだけど。でもasyncしてた時も同じ症状だったし・・・まぁともかくなにかあるんだろうけど、それをデバッグしてる時間がなかった。それにそのメモリ部分以外はちゃんと動いてるし!

ってことでどうせ一回しか動かさないスクリプトなので、こんな形でざっくりとワークアラウンドした。これだとメモリを食う"realscript.pl"は5ファイル処理した後終了するので、少なくとも一定時間で入れ替わる。

    my @files = glob( "data/*.txt" );
    while ( @files ) {
         my @args = splice @files, 0, 5;
         system "realscript.pl", @args;
    }
というわけで本日の教訓は「メモリがないなら定期的に世代交代すればいいじゃない!」でした。本当の教訓は「Coroとか使うときはきちんとメモリの管理を考えようね!」だけど、TPOによってはこれもありかなー(と、お茶を濁す)。