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