メインコンテンツへスキップ

EBRAINSのデータセットがダウンロードできない

·93 文字·1 分

この記事でわかること
#

  • EBRAINSのGUIダウンロードが失敗しやすい理由
  • requests + fairgraph + tqdm を使った自動ダウンロードスクリプトの作り方
  • リトライ・レジューム(途中再開)の実装方法

そもそもEBRAINSって何?
#

EBRAINS は欧州の神経科学データプラットフォームで、脳画像や病理データなどの研究データが公開されている。今回はそこにある病理画像データセット(.ndpi形式、1ファイル数GB)を大量にダウンロードしたかった。


GUIからのダウンロードが全然うまくいかない
#

ZIPダウンロードを試みた
#

まず「まとめてZIPでダウンロード」を試みた。

が、失敗。

よく考えると当たり前で、57ファイル × 約1.5GB = 約85GB をサーバー側で圧縮しながら1本のストリームで送ってくるわけで、途中で切れたら最初からやり直しになる。実際タイムアウトで切れた。

個別にGUIからダウンロードを試みた
#

じゃあ1ファイルずつブラウザからダウンロードしようとしたが、これも途中で切れることがあった。ブラウザはレジューム(途中再開)に対応していないことが多いので、切れたら全部やり直し。1.5GBを何度もダウンロードし直すのはさすがにきつい。

原因
#

EBRAINSのデータは実際には裏側のストレージ(rgw.cscs.ch、スイスのCSCSが運営)から配信されていて、プロキシ経由の構造になっている。

ブラウザ
    ↓
data-proxy.ebrains.eu
    ↓
rgw.cscs.ch  ← ここが不安定

このバックエンドが一時的に応答を止めることがあり、タイムアウトが発生する。GUIでもスクリプトでも同じ経路を通るので避けられない。


自動ダウンロードスクリプトを作った
#

作ったもの
#

ebrains-downloader

  1. EBRAINSにログインしてトークンを取得
  2. annotation.csv(UUID・診断名の対応表)を取得
  3. 指定した診断名でフィルタリング
  4. 該当ファイルを順番にダウンロード(リトライ・レジューム付き)

使い方
#

uv run run.py --diagnosis "Fibrous meningioma"

複数診断名の同時指定も可。

uv run run.py --diagnosis Meningioma Schwannoma

技術スタック
#

ライブラリ用途
fairgraphEBRAINSのKnowledge GraphへのOAuth認証・トークン取得
requestsHTTPダウンロード(ストリーミング・レジューム対応)
tqdmプログレスバー表示

レジューム対応
#

HTTPの Range ヘッダーを使って、途中まで落とせたファイルの続きから再開できるようにした。

# 例:500MB済みなら
Range: bytes=524288000-

ファイルが中途半端に残っていても、サイズを読んで続きをリクエストするだけ。

リトライ対応
#

ネットワーク系のエラー(タイムアウト・接続切断など)が出たら最大5回まで自動でリトライする。実際の動作ログ:

実際の動作ログ

2番目のファイルで465MBのところでタイムアウトが発生したが、そこから自動で再開して無事完了している。


まとめ
#

GUIからのダウンロードがうまくいかない場合、原因はだいたいサーバー側の不安定さで、こちら側でできることは気合いで粘るくらい。
スクリプト化してしまえばあとは放置でよくなるので、大量ファイルのダウンロードには素直に自動化するのが吉。

著者
山田
好きな食べ物:えんがわ