并行流水线

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

近似值;实际性能取决于硬件和数据特征。

results matching ""

    No results matching ""