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生物学

Download history 67/week @ 2024-03-29 56/week @ 2024-04-05 81/week @ 2024-04-12 85/week @ 2024-04-19 90/week @ 2024-04-26 82/week @ 2024-05-03 93/week @ 2024-05-10 110/week @ 2024-05-17 73/week @ 2024-05-24 84/week @ 2024-05-31 94/week @ 2024-06-07 90/week @ 2024-06-14 84/week @ 2024-06-21 68/week @ 2024-06-28 95/week @ 2024-07-05 87/week @ 2024-07-12

每月 348 次下载
用于 4 crates

MIT 许可证

48KB
903

Build Status

一个快速的 fastq 解析器。

这个库可以以 coreutils wc -l 大约的速度处理 fastq 文件(在我的笔记本电脑上大约为 2GB/s,seqan 大约为 150MB/s)。它还使得将 fastq 记录的处理分配给多个核心变得容易,而不会损失太多性能。

有关详细信息和方法,请参阅 文档

基准测试

我们将此库与 rust-bio 中的 fastq 解析器、C++ 库 seqan 2.2.0、kseq.hwc -l 进行比较。

我们测试了 4 种场景

  • 2GB 测试文件在 ramdisk 上解压缩。程序计算文件中的记录数。
  • 测试文件在磁盘上使用 lz4 压缩,具有空的页面缓存。再次,程序应该只计算记录数。
  • 测试文件在磁盘上使用 lz4 压缩,具有空的页面缓存,但程序将记录发送到不同的线程。此线程计算记录数。
  • 与场景 3 相同,但使用 gzip 压缩。

所有测量都是在 Haskwell i7-4510U @ 2GH 上使用 2GB 测试文件(待描述!)进行的。每个程序执行三次(在适当的地方清除 os 页面缓存)并使用最佳时间。不支持压缩算法的库通过 zcatlz4 -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 -lfastq 大部分时间花在 memchr() 上,但与 wc 不同,fastq 需要检查头部是否以 @ 开头,分隔行以 + 开头,并做一些额外的记录。 lz4 -d 使用较大的缓冲区大小(默认4MB),这似乎阻止了操作系统在通过管道连接时并发运行 lz4wcfastq 通过内部队列避免了这个问题。
  • rust-bio 在复制数据和验证utf8方面损失了一些时间。线程版本的大幅减慢源于它将每个记录单独发送到另一个线程。每次发送(我使用rust stdlib中的 sync_channel)都需要使用同步原语,并为标题、序列和质量分配三个空间。将记录收集在 Vec 中,并在有大量记录时再发送,可以将速度从150MB/s提高到250MB/s。
  • seqan 正在分配资源,并使用(我认为)一个简单的 memchr() 实现来查找行中断。

依赖关系

~3MB
~52K SLoC