■2004-12-21
* [Perl] ActivePerl 5.8.6
ActivePerl 5.8.6がリリースされていました。
* [今月のAcme] 今月の……
Acme(本年最後)の変わりにPHP::Perlinfoを紹介しようと思ったら、既に紹介されている方が。改めて12月分のAcmeを探したいと思います。"Content-Type: text/html を最初に吐き出す
" のは、もとのphpinfo()がContent-Type: text/htmlを吐き出すのをまねているからのようにも思えます。
ついでに次の記事で知ったClass::DBI::Plugin::Iteratorをメモ。素晴らしい。さっそく勤め先で試してみたいな。
* [Perl] Plugin::Iteratorの利用
Class::DBI::Plugin::Iteratorを使ってみました。Class::DBI::Pagerと一緒に使うと速いはやい。ただnextを使うとそのたびにSQLが発行されるので手元にある既存のコードで使おうとするとやばいかも。試しにPostgres 7.2で約23000件のデータをretrieve_allしてひたらすら$it->nextしてみました。通常のDBI::Class::Iteratorだと全部まわるのに6秒(retrieveするところから計測)。次にPlugin版ですが、最初の1000件目がまわるのに5秒、次の1000件に11秒、以下17, 24, 29……と、累積的に時間がかかって、いつ果てるともわからないので5000件経過した時点で強制終了。
そこで、LIMITに任意の値を与えられるようにして、データがあるうちはSQLを発行しないように改良してみました。LIMITの値を増やしていくとLIMITが100で全部まわるのに23秒。以下500→11秒、1000→9、2000→8、5000→8、10000→8。同様に約190000件のデータでやってみたところ、通常版48秒に対しLIMIT 10000で64秒。これで一安心?
差分はこんな感じ(下に修正版)。
use Class::DBI::Plugin::Iterator; __PACKAGE__->next_cache_num(200);
next_cache_numを呼び出さない場合は100に設定されます。
[追記] 最初のものは、毎回律儀にfetchしていたので処理に時間がかかるのと、fetchし終わった後にnextするとエラーになりました。そこで一気にオブジェクトを抱えるように修正しました。約190000件のデータはnext_cache_num(10000)で45秒に。 差分2(v.0.03に対して)