并行流水线
fq-compressor 使用 Intel Threading Building Blocks (oneTBB) 实现高吞吐量的并行处理流水线。
流水线架构
压缩和解压工作流遵循 3 阶段流水线模式:
压缩流水线
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ 读取器 │───►│ 压缩器 │───►│ 写入器 │
│(阶段 1)│ │ (阶段 2) │ │(阶段 3)│
└─────────┘ └─────────────┘ └─────────┘
│ │ │
读取 FASTQ ABC + SCM + 写入 .fqc
分块数据 Tokenize block
解压流水线
┌─────────┐ ┌───────────────┐ ┌─────────┐
│ 读取器 │───►│ 解压器 │───►│ 写入器 │
│(阶段 1)│ │ (阶段 2) │ │(阶段 3)│
└─────────┘ └───────────────┘ └─────────┘
│ │ │
读取 .fqc 并行解码 写入 FASTQ
block block 输出
流量控制
基于 Token 的内存管理
流水线使用 token 系统 控制内存使用:
- 固定数量的 token 在流水线中循环
- 每个 token 代表一个"在途" block
- 当所有 token 都在使用中时,读取阶段阻塞,直到有 token 被释放
- 防止处理大文件时内存无限增长
工作窃取
TBB 的工作窃取调度器自动平衡:
- 重任务(ABC 重排序、SCM 编码)在可用核心间分配
- 轻任务(I/O)不会被过度调度
- 无需手动线程管理
异步 I/O 集成
写入阶段使用双缓冲异步 I/O 实现最大吞吐量:
┌──────────────┐ ┌──────────────┐
│ 缓冲区 A │◄───►│ 缓冲区 B │
│ (填充中) │ │ (刷新中) │
└──────────────┘ └──────────────┘
│ │
压缩器 磁盘 I/O
写入此处 写入此处
- 当一个缓冲区被压缩器填充时,另一个正在被刷新到磁盘
- 4 MB 写后缓冲区最小化系统调用开销
- 通过
AsyncWriter实现
启用流水线模式
# 压缩时使用流水线
fqc compress -i input.fastq -o output.fqc --pipeline
# 解压时使用流水线
fqc decompress -i output.fqc -o restored.fastq --pipeline
建议在文件大于 100 MB 时使用流水线模式,此时并行化开销可以被摊销。
性能影响
| 模式 | 压缩速度 | 解压速度 |
|---|---|---|
| 顺序执行 | ~6 MB/s | ~30 MB/s |
| 流水线(4 线程) | ~12 MB/s | ~60 MB/s |
| 流水线(8 线程) | ~18 MB/s | ~90 MB/s |
近似值;实际性能取决于硬件和数据特征。