正文

这几天下载 SRA,遇到的错误有:

  • fasterq-dump.3.1.0 err: cmn_iter.c cmn_read_uint8_array

  • fasterq-dump.3.1.0 err: cmn_iter.c cmn_read_String

以前使用 fasterq-dump 时只是偶然出现这些问题,重新下载也都能解决,但最近有些 SRA 一直下载失败,经过调查发现这种错误在大文件下载时出现异常频繁,且多次下载并没法有效解决问题,因此需要一个替代的方法。

解决方案

由于 fasterq-dump 直接通过 HTTP 下载得到 fastq 文件,该过程很可能由于一些问题中断从而导致下载失败。因此可以通过更稳定的 prefetch 先得到 sra 文件,再通过 fasterq-dump 提取 fastq 文件。

fasterq-dump fetches SRR on the fly via HTTP and there could be fatal errors during the transfer.
prefetch eliminates transfer problems.

具体操作:

1
2
$ prefetch --max-size 100000000 [SRR id]
$ fasterq-dump [SRR id]/[SRR id].sra --progress --details --split-files -v --threads [number of threads]

使用 prefetch 下载的好处有两点:

  1. sra 文件占用的空间较小,因此下载速度更快。
  2. 下载如果因为某种原因中断,仍可以通过相同的命令进行断点重连。

以下是一个使用 slurm 调度系统进行批量下载和读取的示例,没有调度系统的朋友也可以直接参考命令进行多下载任务并行:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#SBATCH -J download
#SBATCH -o download.out
#SBATCH -e download.err
#SBATCH -N 1
#SBATCH -n 4

output_dir="./rawfastq"
mkdir -p $output_dir
mkdir -p tmp

# Download
cat download.list | parallel -j 4 --tmpdir ./tmp "prefetch --max-size 100000000 --progress --output-directory $output_dir {} >$output_dir/prefetch_{}.log 2>&1"

其中 download.list 为一行一个 SRR id 的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#SBATCH -J extract
#SBATCH -o extract.out
#SBATCH -e extract.err
#SBATCH -N 1
#SBATCH -n 16

output_dir="./rawfastq"
mkdir -p $output_dir
mkdir -p tmp

# Extract
cat download.list | parallel -j 4 --tmpdir ./tmp "fasterq-dump $output_dir/{}/{}.sra* --progress --details --split-files -v --outdir $output_dir --threads 4 >$output_dir/fasterq-dump_{}.log 2>&1"
# gzip Compress
ls $output_dir/*fastq | parallel -j 16 gzip {}

这里使用 .sra* 作为后缀的原因是有时下载的 sra 文件其尾缀可能为 .sralite,具体差别可见 SRA Data Formats

若想加速提取过程,可以根据自身情况调整并行数量和 fasterq-dump 使用的线程数量。以上方法经实测非常稳定,对于大文件而言也不会出现报错。

参考资料

本文解决方案皆来自 sra-tools Github issue: