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