6个版本
0.2.6 | 2024年2月15日 |
---|---|
0.1.5 | 2024年2月8日 |
#99 in 生物学
65 每月下载量
在 2 crate 中使用
24KB
356 行
一个简单的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