#random-access #memory-mapped #fasta #indexed #fai #file-read

faimm

使用内存映射文件对索引过的 fasta 进行随机访问

6 个版本 (破坏性)

0.5.0 2024年4月9日
0.4.0 2023年7月21日
0.3.0 2021年6月15日
0.2.1 2020年8月4日
0.1.0 2018年8月17日

#666 in 解析器实现


vcfverifier 中使用

MIT 许可证

20KB
284

faimm

使用内存映射文件对索引过的 fasta 进行随机访问。

用法

此 crate 通过使用内存映射文件读取序列数据来提供索引过的 fasta 访问。它旨在访问基因组大小 fasta 文件上的序列数据,并基于碱基坐标提供随机访问。由于索引过的 fasta 文件每行使用有限数量的碱基(有时是特定平台的换行符)分隔,因此您不能直接使用 mmap 可用的字节。

使用基于零的碱基坐标的 mmap 视图提供访问。然后可以使用此视图遍历碱基(表示为 u8)或解析成字符串。还提供简单的 GC 计数。

访问序列数据不需要 IndexedFasta 可变。这使得它很容易共享。

示例

use faimm::IndexedFasta;
let fa = IndexedFasta::from_file("test/genome.fa").expect("Error opening fa");
let chr_index = fa.fai().tid("ACGT-25").expect("Cannot find chr in index");
let v = fa.view(chr_index,0,50).expect("Cannot get .fa view");
//count the bases
let counts = v.count_bases();
//or print the sequence
println!("{}", v.to_string());

局限性

解析器使用简单的 ASCII 掩码(64..128)来允许字符,不应用任何 IUPAC 转换或验证。此范围之外的内容将被静默忽略。这意味着无效的 fasta 也将被解析。存在相应的 .fai 文件提供了有效 fasta 的假设。需要 Rust >=1.64

替代方案

Rust-bio 提供了合格的索引过的 fasta 读取器。主要区别在于它有一个内部缓冲区,因此在执行读取操作时需要可变。faimm 也更快。如果您想要基于记录的访问(没有 .fai 索引文件)rust-bioseq_io 提供了这种访问。

性能

在人类参考(GRCh38)上计算外显子组目标区域(231_410 个区域)的 GC 含量大约需要 0.7 秒(暖缓存),略快于 bedtools nuc(0.9s 可能是一个更可靠的实现)和 rust-bio(1.3s 与示例相同的实现)。一些测试表明,使用 SIMD 也可以提高计数性能,但尚未发布。

依赖关系

~1MB
~17K SLoC