ddbj / ddbj_validator

DDBJ Validation Rule/Validator/Module/API server
1 stars 0 forks source link

NCBIサイトからの応答が遅い #65

Closed okbp closed 5 years ago

okbp commented 5 years ago

症状

eUtilitiesを使ったPubMed IDの妥当性検証を必要とするサンプルについて、Validation速度が著しく低下した(時期不明)。2-3秒だったものが13-15秒ほど掛かっている。

検証

eUtilitiesAPI(API key使用)に限らず、単なるHTMLコンテンツのダウンロードにも時間がかかる。 NCBI以外のサイトの応答は問題ない。またDDBJ以外の環境からNCBIにアクセスしても問題はない。

okbp commented 5 years ago

有効なPubMed IDをftpサイトから取得し、ローカルDBに保持する方向で検討

PubMedデータ運用の調査

PubMedのFTPサーバの運用についてはREADME.txtに記載されているftp://ftp.ncbi.nlm.nih.gov/pubmed/baseline/README.txt

運用方針(案)

  1. 初回(年に一度)はbaselineのファイルをダウンロードし、XMLをパースして有効PubMedIDを取得しDBにロード
  2. 日次でupdatefilesのファイルをダウンロードし、XMLをパースして有効PubMedIDを追加、削除PubMedIDを削除し、DBを最新の状態に保つ ※ 差分更新のため、日次処理が失敗するとリカバリできない。エラーのキャッチは慎重に行う
okbp commented 5 years ago

DBCLSでも最新PubMedデータを日次ダウンロードしてDBにロードしているらしく、無効IDの判定は以下サービスでも行えそうであるとのこと。

http://tm.dbcls.jp/medline/{PubMed_ID}

有効なPubMedIDの場合はコンテンツ(text)が返ってきて、存在しないIDの場合は空(実際は改行文字0Aが含まれている様子)で返ってくるため、判定が可能。

DBCLSの山本さんに以下確認済み

サービス停止時期が遺伝研サービスと揃うとのことで、ローカルにPubMedIDデータを持つのとあまり遜色ないため利用したい。

tfuji commented 5 years ago

E-utilities on the UNIX Command Line を使うのをお勧めされました。 archive-pubmed -pathとパイプ処理を組み合わせるだけで日次更新やパースも手間なく実現できそうです。

okbp commented 5 years ago

medline用データベースは日次更新で最新のPubMedの情報が取得でき、前日更新のデータも取れることを確認した。

ただ、日次更新の削除については反映されていないようで、最近(最長1年)削除されたPubMedIDが残っている模様(山本さんに確認依頼中)。

削除済みIDリストが日次で更新されるので、これを元にチェックを追加することも可能。 ftp://ftp.ncbi.nlm.nih.gov/pubmed/deleted.pmids.gz

okbp commented 5 years ago

@tfuji ありがとうございます。Entrez Directも考えたのですが、日次更新で削除された分のIDが取得できないかなと断念しました。 最新データを取得する方法を調べたら、山本さんが既に全く同じ方法でデータ取得してサービス運用されているということでしたので、できれば流用させてもらいたいと考えています。 「できるだけネットワークを経由せずローカルに持ちたい」という要件からは外れますが、サービス停止期間は同じですのであまり問題は出ないかなと考えていまして、後ほど質問表で確認させて頂きます。

tfuji commented 5 years ago

調査ありがとうございます。validator以外にも使う可能性のあるリソースなので、取得方法案の提示をお願いします。

okbp commented 5 years ago

medline用データベースで日次削除分が反映されていないバグを直した、と山本さんから連絡あり。medlineで前日までのPubMedIDの妥当性を検証可能な状態になった。

okbp commented 5 years ago

現状の確認方法と問題点

NCBI e-utilitiesで当該pubmed_idを引数にESummaryをリクエストして、結果が返されれば有効IDであると判定 ソースコード

問題点

アクセス制限により数秒かかってしまっている。

提案する確認方法

DBCLSが運用しているmedline(API)でもpubmed_idの有効無効は判定可能なため、e-utilitiesの使用はやめてこれを利用する。日次更新しているため最低前々日までのPubMedの情報が同期されている。

判定方法

有効なIDの場合は以下のURLで結果が得られる。

http://tm.dbcls.jp/medline/1

無効なIDの場合は空データが返される。

http://tm.dbcls.jp/medline/999999999

メリット

デメリット

komstat commented 5 years ago

pubmed 同期の遅延はほとんど問題ないと思いますし、DBCLS サービスを流用する方がメリットが大きいと思います。

okbp commented 5 years ago

Validator 1.0.9としてリリース済み