kraken build_db

最后发布时间 : 2026-02-15 21:15:00 浏览量 :

下面用表格形式把你这条 build_db 命令涉及的参数做系统说明(按“类别 → 参数 → 作用 → 影响”整理)。


🧬 一、核心算法参数(决定数据库结构)

参数是否必需作用原理解释调大会怎样调小会怎样
-k INT✅ 必需设置 k-mer 长度把序列拆成长度为 k 的片段准确率更高敏感度更高
-l INT✅ 必需设置 minimizer 长度每个 k-mer 中选最小的 l-mer 作为代表hash 更少,更压缩hash 更多,占内存
-S BITSTRING可选Spaced seed 掩码1=使用该位,0=忽略提高突变容忍精度更高但容错差
-T BITSTRING可选minimizer toggle mask控制 minimizer 参与位置可进一步优化内存一般不常用
-X可选输入是蛋白序列启用氨基酸模式用于蛋白数据库DNA 不可用

🗂 二、输入输出文件参数(数据库组成文件)

参数是否必需作用生成/读取的文件说明
-H FILE✅ 必需Kraken2 hash 表文件hash.k2d存 minimizer → taxid
-t FILE✅ 必需taxonomy 文件taxo.k2d存 taxid 层级结构
-o FILE✅ 必需options 文件opts.k2d记录构建参数
-n DIR✅ 必需NCBI taxonomy 目录nodes.dmp提供分类层级
-m FILE✅ 必需seqid → taxid 映射seqid2taxid.map序列对应物种

🧠 三、Hash 表容量控制(内存核心)

参数是否必需作用影响
-c INT✅ 必需设置 hash 容量太小会溢出,太大会占内存
-M INT可选最大容量(MiniKraken)用于构建压缩数据库
-r INT可选每个 taxid 使用 bit 数控制内存占用

📌 你用的是:

-c 24137

约等于 24G 容量。


⚡ 四、性能控制参数

参数是否必需作用建议
-p INT可选线程数建议设为 CPU 核数
-F可选快速构建(非确定性)加快速度
-B INT可选读取块大小I/O 优化
-b INT可选子块大小内部处理优化

📊 五、你当前命令参数总结

参数当前值含义
k-mer35标准 Kraken2 DNA
minimizer31默认推荐值
spaced seed已开启提高突变容忍
capacity24137大型数据库
threads1速度较慢
taxid bit自动默认

🧩 六、参数之间的关系图

k (35)
 └─ 内部选 l (31)
       └─ 应用 S mask
            └─ 插入 CHT (capacity=c)

🎯 七、最重要的 3 个参数

如果你只记住三个:

| 排名 | 参数 | 决定什么 |
| -- | -- | ---------- |
| ① | -k | 准确率 vs 敏感度 |
| ② | -l | 数据库大小 |
| ③ | -c | 内存占用 |


🚀 如果你想更深入

我可以再给你:

  • 📐 minimizer 数学原理表格
  • 💾 内存计算公式
  • 🧮 capacity 如何估算
  • 🔬 DNA vs Protein 模式对比表
  • 🧠 Kraken2 CHT 结构解析

你想看哪一块?

很好 👍 我来专门解释:

Kraken 2 中,这个哈希表是如何用于“基因序列”的?

你刚刚看到的 Rust 示例:

table.compare_and_set(12345, 5, &mut old);

这里的 12345 在真实 Kraken 中并不是随便的数字,而是:

🔬 一个 k-mer(DNA 片段)的编码结果


一、Kraken 中真正存的是什么?

Kraken 不是直接存整条基因序列。

它存的是:

k-mer  →  taxid

例如:

DNA 序列:

ATGCGTACGTTAGC

如果 k = 5

会被切成:

ATGCG
TGCGT
GCGTA
CGTAC
...

这些 5-mer 就是哈希表的 key。


二、DNA 如何变成数字?

Kraken 里会把 DNA 编码成 2-bit 表示:

| 碱基 | 二进制 |
| -- | --- |
| A | 00 |
| C | 01 |
| G | 10 |
| T | 11 |

比如:

ATGC

变成:

00 11 10 01

变成一个 8-bit 整数。

k=31 时,就是 62-bit 整数。

👉 这就是:

hkey_t key

三、哈希表中存的到底是什么?

Kraken 不存完整 key。

它存:

hash(key) 的高位部分  →  taxid

结构:

[ hashed_key | taxid ]

例如:

字段bits
hashed_key20 bits
taxid12 bits

总共 32 bits。


四、构建数据库时发生什么?

数据库构建阶段:

对每个参考基因组:

for 每条DNA序列:
    for 每个k-mer:
        key = encode(k-mer)
        taxid = 当前物种ID
        hash_table.compare_and_set(key, taxid)

如果:

  • 该 k-mer 第一次出现 → 插入 taxid
  • 该 k-mer 已经存在,但来自不同物种 → 存 LCA(最近共同祖先)

五、查询时发生什么?

当 Kraken 分类一条 read:

输入 read:
ATGCGTACGTTAGC...

步骤:

1️⃣ 切成 k-mer
2️⃣ 每个 k-mer 查询 hash 表:

let taxid = table.get(encoded_kmer);

3️⃣ 得到一堆 taxid:

562
562
561
562
0

4️⃣ 投票决定最终分类


六、你写的 Rust 示例在 Kraken 中对应什么?

你写的:

table.compare_and_set(12345, 5, &mut old);

在 Kraken 里真实对应的是:

let encoded_kmer = encode_dna("ATGCGT...");
let taxid = 562;  // E. coli

table.compare_and_set(encoded_kmer, taxid, &mut old);

七、为什么要“压缩”?

因为数据库非常巨大。

假设:

  • 30 亿碱基
  • k=31
  • 可能有 10^9 个 k-mer

如果每个 cell 8 字节:

8GB 内存

但 Kraken 只用:

4 字节 / cell

节省一半内存。


八、CompactHashTable 在 Kraken 中的角色

它是:

🧠 所有 k-mer 到物种 ID 的高速查找索引


九、整体流程图

构建数据库:

Genome → k-mer → encode → hash → CompactHashTable

分类 read:

Read → k-mer → encode → hash lookup → taxid → 投票

十、为什么允许“概率型错误”?

因为只存 hash 的高位部分。

可能发生:

两个不同 k-mer → 同样的 compacted_key

这叫:

假阳性

但概率极低,而且:

  • Kraken 使用大量 k-mer 投票
  • 单个错误不会影响整体结果

十一、真实世界例子

假设数据库中:

ATGCG → 562 (E. coli)

查询时:

read: ATGCGTACG...

切片:

ATGCG → 查到 562

如果 read 中 80% k-mer 都指向 562

最终分类为:

Escherichia coli

十二、总结一句话

Kraken 2 中:

CompactHashTable 存储的是
“DNA k-mer → 物种 taxid” 的压缩索引
用于超高速分类基因序列


如果你愿意,我可以下一步讲:

  • 🔬 LCA 是如何计算的?
  • 🧬 minimizer 是怎么减少内存的?
  • 🚀 为什么 Kraken2 比 Kraken1 快?
  • 🦀 Rust 版本如何支持真实 DNA 编码?

你想往哪块深入?