Zend_CacheのPDOバックエンド
はてなダイアリーの形態素数を数えるクローラー - Paradigm Shift Designではてなのエントリをクロールして、形態素解析する話を書いたけれども、あれからエントリの形態素から特徴語を抽出するために少し機能拡張した。
TFIDFのDFを求めるためにYahooを、はてなキーワードかどうかを確かめるためにはてなキーワードAPIを使っているのだけれども、それの結果のキャッシュに異常に時間がかかってた。Webの情報にアクセスする部分は5秒でタイムアウトするように設定していたにもかかわらず、時折1分とか時間がかかるので解析に時間がかかってるとかそういうことを疑って調べていたんだけれど、どうしても原因が分からず。
どうしようもないので、とりあえずxdebugでプロファイルしてみたら、キャッシュをcleanupするタイミングでものすごく重くなっていた。
キャッシュにはZend_CacheをFileバックエンドで使っていたのだけれど、ファイル数が1万を超えた辺りから重くなり、3万を超えた辺りで使い物にならなくなりました。
ふむ・・・とおもってSqliteバックエンドに乗り換えてみた。効果あり。とても早くなった!と思ったのもつかの間。Sqliteのデータベースが600MBを越えた辺りから微妙に遅くなり始めました。そもそも、これってそういう用途には使えないのかな、キャッシュだし。
で、RDBをバックエンドに使えないかと思って探してみましたが見つからず。面倒なのでSqliteを下地にして作りました。私はPostgreSQLを使っていますが今のところ快調に動いています。
/lang/php/misc/Zend_Cache_Backend/Pdo.php –
CodeRepos::Share – Trac
作った後、CodeReposにアカウントを作ってもらっていたことを思い出しておいておきました。Zend/Cache/Backend/Pdo.phpとして設置して、次のようにしてお使いください。
<?php $engine = Zend_Cache::factory("Core", "Pdo", array('lifetime' => 3600, 'automatic_serialization' => true), array('cache_db_dsn' => "pgsql:host=localhost; dbname=cache", 'cache_db_username' => 'mogemoge', 'cache_db_password' => 'hogehoge')); ?>
auto_vacuumはしません。
また、BLOBのことを考えるのはいやだったのでcacheデータはTEXTです。
んー。しかし、Sqliteは所詮、Liteなんだな。良く分かった。