8 个版本 (4 个破坏性版本)
使用旧的 Rust 2015
| 0.6.0 | 2018 年 8 月 10 日 |
|---|---|
| 0.5.0 | 2017 年 7 月 30 日 |
| 0.4.2 | 2017 年 7 月 7 日 |
| 0.4.1 | 2016 年 12 月 2 日 |
| 0.2.0 | 2016 年 11 月 29 日 |
#114 在 生物学 中
每月 348 次下载
用于 4 crates
48KB
903 行
一个快速的 fastq 解析器。
这个库可以以 coreutils wc -l 大约的速度处理 fastq 文件(在我的笔记本电脑上大约为 2GB/s,seqan 大约为 150MB/s)。它还使得将 fastq 记录的处理分配给多个核心变得容易,而不会损失太多性能。
有关详细信息和方法,请参阅 文档。
基准测试
我们将此库与 rust-bio 中的 fastq 解析器、C++ 库 seqan 2.2.0、kseq.h 和 wc -l 进行比较。
我们测试了 4 种场景
- 2GB 测试文件在 ramdisk 上解压缩。程序计算文件中的记录数。
- 测试文件在磁盘上使用 lz4 压缩,具有空的页面缓存。再次,程序应该只计算记录数。
- 测试文件在磁盘上使用 lz4 压缩,具有空的页面缓存,但程序将记录发送到不同的线程。此线程计算记录数。
- 与场景 3 相同,但使用 gzip 压缩。
所有测量都是在 Haskwell i7-4510U @ 2GH 上使用 2GB 测试文件(待描述!)进行的。每个程序执行三次(在适当的地方清除 os 页面缓存)并使用最佳时间。不支持压缩算法的库通过 zcat 或 lz4 -d 从管道获取输入。所有程序都可以在这个存储库的 examples 目录中找到。
| ramdisk | lz4 | lz4 + 线程 | gzip | gzip + 线程 | |
|---|---|---|---|---|---|
wc-l |
2.3GB/s | 1.2GB/s | NA | 300MB/s | NA |
fastq |
1.9GB/s | 1.9GB/s | 1.6GB/s | 650MB/s | 620MB/s |
rust-bio |
730MB/s | NA | 250MB/s | NA | NA |
seqan |
150MB/s | NA | NA | NA | NA |
kseq.h |
980MB/s | 680MB/s | NA | NA | NA |
以下是从检查 perf record 得到的注意事项
wc -l和fastq大部分时间花在memchr()上,但与wc不同,fastq需要检查头部是否以@开头,分隔行以+开头,并做一些额外的记录。lz4 -d使用较大的缓冲区大小(默认4MB),这似乎阻止了操作系统在通过管道连接时并发运行lz4和wc。fastq通过内部队列避免了这个问题。rust-bio在复制数据和验证utf8方面损失了一些时间。线程版本的大幅减慢源于它将每个记录单独发送到另一个线程。每次发送(我使用rust stdlib中的sync_channel)都需要使用同步原语,并为标题、序列和质量分配三个空间。将记录收集在Vec中,并在有大量记录时再发送,可以将速度从150MB/s提高到250MB/s。seqan正在分配资源,并使用(我认为)一个简单的memchr()实现来查找行中断。
依赖关系
~3MB
~52K SLoC