#生物信息学 #基因组学 #计算生物学

genomap

一个用于按染色体索引存储通用基因组数据的小型库

6个版本

0.2.6 2024年2月15日
0.1.5 2024年2月8日

#99 in 生物学

Download history 30/week @ 2024-04-02 1/week @ 2024-05-14 4/week @ 2024-05-21 1/week @ 2024-05-28 4/week @ 2024-06-04

65 每月下载量
2 crate 中使用

MIT 许可证

24KB
356

Crates.io Crates.io docs Rust CI DOI

一个简单的Rust库,用于按染色体名称索引存储数据

genomap是一个小型库,用于在GenomeMap中存储染色体名称与一些通用数据之间的键值映射。由于在几乎所有情况下我们都需要按名称对染色体进行排序,因此GenomeMap维护一个内部排序键集。GenomeMap使用一个专门的染色体名称排序函数,该函数应正确地排序常染色体、性染色体,处理果蝇染色体名称(例如2L和2R)等。如果排序顺序与您预期不符,请提交GitHub问题

内部,存储在genomap::GenomeMap<T>中的数据在Vec<T>中,类型维护一个排序的染色体名称列表,以及一个将Vec中的位置与染色体名称相关联的前向和后向查找表。

以下是一个代码示例

use genomap::GenomeMap;

let mut sm: GenomeMap<i32> = GenomeMap::new();
sm.insert("chr1", 1).unwrap();
sm.insert("chr2", 2).unwrap();

// get a reference to a value by name
println!("{:?}", sm.get("chr1"));

// iterate through name/values
for (name, value) in sm.iter() {
   println!("{} -> {}", name, value);
}

// get the index for a chromosome name
let index = sm.get_index_by_name("chr1").unwrap();
assert_eq!(index, 0);

// get a name by index
assert_eq!(sm.get_name_by_index(index).unwrap(), "chr1");

在Rust中,处理非Copy类型,如String染色体名称键,可能需要通用的生命周期注释。这可能会使代码变得混乱,并显著增加复杂性。为了防止这种情况,genomap通过一个usize索引提供O(1)访问,因此可以将染色体名称索引存储在Struct中,而不是存储在String键中。

性能

benches/comparison.rs中提供了多个创建和访问基准测试。以下是一些基准测试的简要概述。对于创建时间,GenomeMap大约慢20%。但这只会发生一次(绝对规模不重要)。

数据结构 时间 因子
FnvHashMap 28.217 µs 1.000
IndexMap 29.844 µs 1.058
BTreeMap 29.401 µs 1.041
HashMap 29.420 µs 1.043
基因组映射 33.913 微秒 1.202

基因组映射具有第二快的排序访问时间(它内部使用FnvHashMap的哈希函数,但有一个额外的常数查找时间操作)。

数据结构 时间 因子
FnvHashMap 68.555 纳秒 1.00
基因组映射 198.55 纳秒 2.89
IndexMap 237.47 纳秒 3.46
HashMap 336.32 纳秒 4.91
BTreeMap 567.95 纳秒 8.28

依赖项

约290-750KB
约18K SLoC