BioPerl でTaxonomy IDだの生物種名だの
BioSampleっていうデータベースができまして、実験サンプルの情報が収載されるようになったわけですが、今までTaxnomy IDで管理されていたのがBioSample IDになってTaxonomy IDが振られなくなったなどと騒いでいるのが世に言うTaxonomy ID問題ってやつだったりします。
そんな中、自分のやっておるDBCLS SRA ( http://sra.dbcls.jp/ ) では、前のバージョンで(って現バージョンにがっちゃんこできていないってやつですが)生物種からの検索機能を強化していまして、イネで調べたらその下のindicaやjaponicaも出るようにするなどという機能をつけております。
最近、どうもそのデータベースの更新がコケていたようで、それはそれでご迷惑をおかけしとったわけですが、さらによく調べると、この機能が重い重い。全然 反応が返ってこない。いろいろと調べた結果、IDと名前の対応、親子関係を抽出するのに、ローカルのファイルを見ていたところであったことがわかりました。具体的には
my $dbh = Bio::DB::Taxonomy->new( -source => 'flatfile',
-directory => '/tmp/',
-nodesfile => '/share/data/taxonomy/nodes.dmp',
-namesfile => '/share/data/taxonomy/names.dmp');
これをやると、nodes.dmp と names.dmp から/tmpにインデックスファイルを作成して、それをみてうねうねする、というような仕様のようで、で、処理の度にインデックスファイルを作成→終わったら消すをやっていた模様。どうせなら、そのインデックスファイルをそのままにしておいて、そこ指定するとひっぱってこれる、というような仕様にするとかすればよいのに。
ちなみに、こうやって読み込んだ後の処理の例として
$taxon_in_obj = $dbh->get_taxon(-name => $taxon_in);
if ($taxon_in_obj ne "") {
$taxon_id = $taxon_in_obj->id;
}
生物種名を入れて、Taxonomy IDを出すあたりがこれです(本当はもっと短く書ける)。
で、つどつどインデックスファイル作って消して、が時間がかかるようなので、つどつどNCBIに訊くに変更。
my $dbh = Bio::DB::Taxonomy->new( -source => 'entrez');
それだけで、読み込んだ後の処理の部分はまったくいじらずで大丈夫。
これで数十秒(場合によっては分単位)かかっていたのが、数秒で結果で返ってくるようになりましたとさ。