3 个版本 (破坏性)
0.3.0 | 2022年7月17日 |
---|---|
0.1.0 | 2017年7月21日 |
0.0.1 | 2017年5月13日 |
#128 in 生物学
40KB
620 行
bamrescue
bamrescue 是一个命令行工具,用于检查二进制序列比对/映射 (BAM) 文件是否损坏,并在它们发生损坏时尽可能多地从中恢复数据。
安装
在 ArchLinux 及其衍生版(Manjaro、Antergos…)上
AUR 上提供了 ArchLinux 及其衍生版的 PKGBUILD,它仅与最新的 ArchLinux 进行了测试。
# Get the PKGBUILD
git clone https://aur.archlinux.org/bamrescue.git
# Add the author's PGP key
gpg2 --recv-keys FA490B15D054C7E83F70B0408C145ABAC11FA702
# Build and install bamrescue
cd bamrescue
makepkg -si
或者,您可以使用 AUR 辅助工具(如 yay)安装 bamrescue
# Install bamrescue
yay -S bamrescue
在 Debian 及其衍生版(Ubuntu、Mint…)上
为 Debian 及其衍生版提供了预构建包。它们仅在 Debian 8 (Jessie)、Debian 9 (Stretch)、Ubuntu 16.04 LTS (Xenial) 和 Ubuntu 18.04 LTS (Bionic) 上进行了测试。
# Install prerequisites
sudo apt install curl apt-transport-https
# Add the author's PGP key
curl -s https://arkanosis.net/jroquet.pub.asc | sudo apt-key add -
# Add the author's apt stable channel to your apt sources
echo "deb https://apt.arkanosis.net/ software stable" | sudo tee /etc/apt/sources.list.d/arkanosis.list
# Update and install bamrescue
sudo apt update
sudo apt install bamrescue
用法
Usage: bamrescue check [--quiet] [--threads=<threads>] <bamfile>
bamrescue rescue [--threads=<threads>] <bamfile> <output>
bamrescue -h | --help
bamrescue --version
Commands:
check Check BAM file for corruption.
rescue Keep only non-corrupted blocks of BAM file.
Arguments:
bamfile BAM file to check or rescue.
output Rescued BAM file.
Options:
-h, --help Show this screen.
-q, --quiet Do not output statistics, stop at first error.
--threads=<threads> Number of threads to use, 0 for auto [default: 0].
--version Show version.
工作原理
BAM 文件是一个 BGZF 文件(规范),因此由一系列符合 RFC1592 的 gzip 块(规范)连接而成。
每个 gzip 块最多包含 64 KiB 的数据,包括用于检查其完整性的未压缩数据的 CRC32 校验和。
此外,由于gzip块的开始是gzip标识符(即0x1f8b),固定的gzip方法(即0x8)和固定的gzip标志(即0x4),以及bgzf块包含bgzf标识符(即0x4243),固定的额外子字段长度(即0x2)以及它们自己的压缩大小,因此可以跳过损坏的块(最多64 KiB),以有限的复杂性和可接受的可靠性到达下一个非损坏的块。
此属性用于通过仅保留非损坏的块来从损坏的BAM文件中恢复数据,希望恢复大多数读取数据。
示例
一个40 MiB的BAM文件(在今天标准下非常小)已经被两个硬盘坏道损坏。大多数工具(包括gzip)在第一个损坏的字节处就会卡住,这意味着根据工具的不同,高达100%的BAM有效载荷被认为是丢失的。
让我们使用bamrescue来检查该文件
$ bamrescue check samples/corrupted_payload.bam
bam file statistics:
1870 bgzf blocks checked (117 MiB of bam payload)
2 corrupted blocks found (0% of total)
46 KiB of bam payload lost (0% of total)
确实,一个整块硬盘坏道通常对应于512字节的丢失,这比平均bgzf块(可高达64 KiB)要小得多。
尽管大多数工具会放弃这个文件,但它仍然包含几乎100%的非损坏BAM有效载荷,如果用户只能处理接近100%的数据量,他们可能不会太在意。
让我们恢复非损坏的有效载荷(注意:这需要与原始文件一样多的额外磁盘空间)
$ bamrescue rescue samples/corrupted_payload.bam rescued_file.bam
bam file statistics:
1870 bgzf blocks found (117 MiB of bam payload)
2 corrupted blocks removed (0% of total)
46 KiB of bam payload lost (0% of total)
1868 non-corrupted blocks rescued (100% of total)
111 MiB of bam payload rescued (100% of total)
恢复的BAM文件现在可以像从未损坏过一样使用。使用CRC32校验和验证恢复数据,所以它不像忽略错误并在损坏数据上工作(gzip从损坏的BAM文件中获取垃圾数据的典型用途):它是在(荒谬的)更少、经过验证的数据上工作。
性能
bamrescue非常快。实际上,它在完成更多工作的同时比gzip还要快。
以下是一个40 MiB的非损坏BAM文件的一些数字
命令 | 时间 | 检测到损坏 |
---|---|---|
gzip -t | 695 ms | 否 |
bamrescue check -q --threads=1 | 1181 ms | 否 |
bamrescue check -q --threads=2 | 661 ms | 否 |
bamrescue check -q --threads=4 | 338 ms | 否 |
bamrescue check --threads=1 | 1181 ms | 否 |
bamrescue check --threads=2 | 661 ms | 否 |
bamrescue check --threads=4 | 338 ms | 否 |
以下是一个40 MiB BAM文件(有两个单字节损坏,分别在7 MiB和18 MiB附近)的一些数字
命令 | 时间 | 检测到损坏 | 报告的损坏块数量 | 可恢复数据量¹ |
---|---|---|---|---|
gzip -t | 93 ms | 是 | 不适用 | 21 Mio(18%) |
bamrescue check -q --threads=1 | 157 ms | 是 | 不适用 | 21 Mio(18%) |
bamrescue check -q --threads=2 | 91 ms | 是 | 不适用 | 21 Mio(18%) |
bamrescue check -q --threads=4 | 56 ms | 是 | 不适用 | 21 Mio(18%) |
bamrescue check --threads=1 | 1174 ms | 是 | 2 | 117 Mio(99.99%) |
bamrescue check --threads=2 | 659 ms | 是 | 2 | 117 Mio(99.99%) |
bamrescue check --threads=4 | 338 ms | 是 | 2 | 117 Mio(99.99%) |
¹未压缩的BAM有效载荷,使用gzip -d或bamrescue rescue恢复
注意:这些基准测试是在Intel Core i5-6500 CPU上运行的Kubuntu 16.04.2和rustc 1.18.0上运行的。
注意事项
bamrescue不会检查BAM有效载荷是否实际上符合BAM规范。它只检查它是否在创建后未损坏,使用gzip和bgzf格式内建的错误检测代码。这意味着,只要用于创建BAM文件的工具符合规范,bamrescue的输出也将如此,但bamrescue本身不会采取任何措施来验证这种合规性。
编译
在您的工作副本中运行cargo build --release
。
贡献和报告错误
通过GitHub拉取请求欢迎贡献。
请向GitHub issues报告错误和功能请求。
许可证
bamrescue版权所有(C)2017-2018 Jérémie Roquet [email protected],并授权使用ISC许可证。
依赖项
~4–13MB
~149K SLoC