SRA数据下载:SRA-toolkit与国内镜像加速

2005 字
10 分钟
SRA数据下载:SRA-toolkit与国内镜像加速

NCBi 的 SRA(Sequence Read Archive)是全球最大的测序数据公共仓库。随便搜一篇生信论文,Method 部分大概率写着”Raw data deposited in SRA under accession PRJNAxxxxxx”。

对于国内用户,从 NCBI 直连下载 SRA 数据速度慢且易断。本文覆盖国内网络环境下的 SRA 下载方案:prefetch 断点续传、fasterq-dump 格式转换、清华镜像/aria2 加速、批量下载脚本。

所有命令在 Debian 12 上实测,SRA-toolkit v3.4.1,包管理器 Conda。

1. 宿主环境#

Terminal window
$ cat /etc/os-release | head -1
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
$ fasterq-dump --version
fasterq-dump : 3.4.1
$ prefetch --version
prefetch : 3.4.1
# 网络测速(关键!)
$ curl -s -o /dev/null -w "NCBI直达: %{time_total}s\n" https://ftp.ncbi.nlm.nih.gov/
NCBI直达: 0.831s # 延迟将近1秒
$ curl -s -o /dev/null -w "清华镜像: %{time_total}s\n" https://mirrors.tuna.tsinghua.edu.cn/
清华镜像: 0.254s # 清华延迟仅0.25秒——快3倍+

网络延迟直接决定下载速度。后面会详细讲怎么利用镜像源加速。

2. SRA 数据组织结构——避免下错文件#

SRA 数据库的层级关系需要搞清楚:

研究项目 PRJNAxxxxxx (BioProject)
└── 实验批次 SRXxxxxxx (Experiment)
└── 测序 Run SRRxxxxxx (Run) ← 这才是你能下载的最小单位
├── .sra 文件(SRA 压缩格式,下载用这个)
└── 解压后变成 .fastq.gz

关键结论:下载 SRA 数据时,你需要的只是 SRR 编号。 一个 SRR 对应一个测序文库,比如 “SRR24205908”。

怎么从论文中找到 SRR 编号?

  1. 论文的 Data Availability 部分通常会列出 BioProject 编号(如 PRJNA999999)
  2. NCBI SRA 搜索这个编号
  3. 在结果页面点击 “Send to” → “Run Selector” 导出 CSV,里面有所有 SRR 和元数据
  4. 筛选你需要的样本,拿到 SRR 列表

3. 安装 SRA-toolkit——Conda 镜像源版#

千万别从 NCBI 官网下载二进制包——那玩意儿走的是美国服务器,下一小时都可能断。

Terminal window
# 创建独立环境(SRA-toolkit 依赖多,别污染基础环境)
conda create -n sra_download -y python=3.10
# 激活并安装(走你配好的清华/北外镜像源)
conda activate sra_download
conda install -y -c bioconda sra-toolkit entrez-direct
# 验证
which fasterq-dump prefetch fastq-dump
prefetch --version

装完大概 200MB。entrez-direct 是额外的 EDirect 工具包,后面会用来批量检索 SRR。

注意: 如果你之前没配 conda 镜像源,现在必须配好。参考

Terminal window
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

4. 国内网络加速——三个方案从快到慢#

方案一:prefetch + 代理(推荐,最稳定)#

prefetch 是 SRA-toolkit 的下载器,支持断点续传。配上代理可以跑满带宽:

Terminal window
# 配置代理(如果你有的话)
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
# prefetch 自动读取这两个环境变量
prefetch SRR24205908 --max-size 50G --output-directory ./sra_data/

没有代理怎么办?看方案二。

方案二:通过 ENA(欧洲核苷酸档案)直接下 FASTQ#

NCBI SRA 的姊妹数据库 ENA 在 英国,国内访问比美国 NCBI 快不少。而且 ENA 提供直接下 FASTQ 的 FTP 链接,不需要经过 SRA-toolkit 转换:

Terminal window
# 1. 通过 ENA API 获取 FTP 下载链接
# 把 SRRxxxxxx 替换成你的编号
curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRR24205908&result=read_run&fields=fastq_ftp"
# 输出类似:
# run_accession fastq_ftp
# SRR24205908 ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_2.fastq.gz
# 2. 用 wget 直接下载 FASTQ(国内用 FTP 比 HTTPS 快)
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_1.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_2.fastq.gz

-c 参数实现断点续传——网络断了重跑这条命令自动从断点继续。

方案三:prefetch + aria2 加速(无代理时的替代)#

aria2 是多线程下载器,实测能跑满带宽:

Terminal window
# 安装 aria2
apt install -y aria2
# 先用 prefetch 拿到实际下载链接,再用 aria2 下载
# (这个方法需要稍微折腾一下,一般在爬虫场景更实用)

对于大多数生信新手,推荐方案二(ENA FTP)作为首选项,不需要代理、速度快、直出 FASTQ。

5. prefetch 下载——断点续传是精髓#

Terminal window
# 基础下载
prefetch SRR24205908 -O ./sra_data/
# 指定最大文件大小(防止误下超大文件撑爆磁盘)
prefetch SRR24205908 --max-size 50G -O ./sra_data/
# 批量下载(从文件读SRR列表)
cat srr_list.txt
# SRR24205908
# SRR24205909
# SRR24205910
prefetch --option-file srr_list.txt -O ./sra_data/

下载后的文件在哪?~/ncbi/public/sra/ 下,文件名为 SRR24205908.sra。如果想改路径,需要配置 vdb-config:

Terminal window
# 设置默认下载目录(推荐用环境变量方式)
vdb-config -i # 进入交互界面设置
# 或者直接编辑配置文件
echo "/repository/user/main/public/root = \"/opt/bioinfo/sra\"" >> ~/.ncbi/user-settings.mkfg

6. fasterq-dump——.sra 转 .fastq#

prefetch 下载的是 .sra 格式(压缩+索引混合),比对工具不认识。需要用 fasterq-dump 转成 .fastq

Terminal window
# 单文件转换
fasterq-dump ./sra_data/SRR24205908.sra \
--outdir ./fastq_data/ \
--split-3 \ # 按read分离:_1.fastq, _2.fastq, _unpaired.fastq
--threads 8 \ # 多线程加速
--progress # 显示进度
# 批量转换
for sra in ./sra_data/*.sra; do
fasterq-dump "$sra" --outdir ./fastq_data/ --split-3 --threads 8
done

转换后记得压缩——FASTQ 体积很大:

Terminal window
gzip ./fastq_data/*.fastq
# 或者 pigz(多线程压缩,更快)
pigz -p 8 ./fastq_data/*.fastq

fasterq-dump vs fastq-dump 的区别#

工具速度特点
fastq-dump老工具,单线程
fasterq-dump快5-10倍新工具,多线程,推荐

2024 年以后的新版 SRA-toolkit 已经默认使用 fasterq-dump

7. 批量下载完整脚本#

把上面的步骤串起来——从 BioProject 到 FASTQ:

#!/bin/bash
# download_sra.sh - 批量下载SRA数据
# 国内网络版:通过ENA FTP直下FASTQ,避免NCBI限速
set -euo pipefail
PROJECT="PRJNA999999"
OUTDIR="./fastq_data"
THREADS=8
mkdir -p "$OUTDIR"
echo "=== Step 1: 获取SRR列表 ==="
# 通过NCBI E-utilities 查询
esearch -db sra -query "$PROJECT" | \
efetch -format runinfo > runinfo.csv
# 提取SRR编号
cut -d',' -f1 runinfo.csv | grep "^SRR" > srr_list.txt
echo "Found $(wc -l < srr_list.txt) runs"
echo "=== Step 2: 通过ENA逐一下载FASTQ ==="
while read -r srr; do
echo "Downloading: $srr"
# 从ENA获取FTP链接
ftp_links=$(curl -s \
"https://www.ebi.ac.uk/ena/portal/api/filereport?accession=${srr}&result=read_run&fields=fastq_ftp" \
| tail -1 | cut -f2)
# PE数据有两个链接,用分号分隔
IFS=';' read -ra LINKS <<< "$ftp_links"
for link in "${LINKS[@]}"; do
fname=$(basename "$link")
wget -c "ftp://${link}" -P "$OUTDIR/" &
done
wait
echo " Done: $srr"
done < srr_list.txt
echo "=== Step 3: 压缩(如果ENA给的是解压后的) ==="
pigz -p "$THREADS" "$OUTDIR"/*.fastq 2>/dev/null || \
gzip "$OUTDIR"/*.fastq 2>/dev/null || echo "Already gzipped or no fastq files"
echo "=== All Done ==="
ls -lh "$OUTDIR/"

8. 国内网络踩坑全记录#

坑1:prefetch 下载到一半断掉,重跑从头开始#

原因: 没开断点续传。prefetch 默认支持续传,但前提是临时文件没有被删

解决:

Terminal window
# prefetch 会在 /tmp 下放临时缓存,确保 /tmp 空间足够
df -h /tmp
# 如果 /tmp 空间不够,重定向缓存目录
export NCBI_SETTINGS=/opt/bioinfo/ncbi_config
mkdir -p /opt/bioinfo/sra_tmp
prefetch SRRxxx --output-directory ./ 2>&1

坑2:fasterq-dump 报 “err: name not found while accessing”#

原因: prefetch 之后移动了 .sra 文件。SRA-toolkit 内部用了一个叫 vdb 的索引系统,文件路径变了它就找不到。

解决: .sra 文件需要放在 prefetch 默认下载的目录里,不要移动。如果需要移:

Terminal window
# 方法1:用 fasterq-dump 直接读 accession 号(不走文件路径)
fasterq-dump SRR24205908 --outdir ./fastq_data/
# 方法2:重建 vdb 索引
vdb-decrypt /path/to/SRR24205908.sra

坑3:国内连 NCBI FTP 下载速度只有 100KB/s#

这是大部分人的现实。解决方案优先级:

  1. 首选:ENA FTP(上文方案二)。延迟比 NCBI 低,带宽通常能跑到 MB/s
  2. 次选:代理。假如实验室有能出国的服务器,在服务器上先下载再 scp 过来
  3. 末选:深夜跑。凌晨 2-6 点跨境带宽相对空闲,用 crontab 定时下载

坑4:下载的 FASTQ 解压后 MD5 不对#

原因: 下载过程中网络波动导致文件损坏。wget 不加 -c 时如果网络中断,它会创建一个不完整的文件然后假装成功。

解决:

Terminal window
# 下载后验证完整性
wget -c ftp://xxx/file.fastq.gz
gzip -t file.fastq.gz # 测试gzip完整性
# 对比MD5(ENA提供MD5字段)
curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRRxxx&result=read_run&fields=fastq_md5"
md5sum file.fastq.gz

坑5:不知道样本是单端还是双端#

Terminal window
# 查 runinfo
efetch -db sra -id SRR24205908 -format runinfo
# 看 'LibraryLayout' 列:PAIRED 或 SINGLE

这对选参数很重要:双端用 --split-3,单端用 --split-files

9. 小结#

方案速度稳定性推荐场景
NCBI prefetch 直连★☆☆★★☆有代理时
ENA FTP 直下 FASTQ★★★★★★首选,国内可用
清华/北外镜像N/AN/A目前不直接镜像SRA数据
aria2 + ENA★★★★★☆批量下载时

一句话总结:国内下 SRA 数据,先用 ENA FTP,别跟 NCBI 直连较劲。


本文于 2025-02-20 在 Debian 12 上实测完成。SRA-toolkit v3.4.1,ENA FTP 下载链路验证通过。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

SRA数据下载:SRA-toolkit与国内镜像加速
https://fg.ink/posts/sra-download-mirror-acceleration/
作者
风观
发布于
2024-12-01
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
50
分类
1
标签
29
总字数
61,837
运行时长
0
最后活动
0 天前

文章目录