今回複数の非常にたくさんのデータが入ったファイルを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によってはこれもありかなー(と、お茶を濁す)。
コメント