nuget server logo nuget api documents
↑

API Docs / SMRUCC.genomics.Analysis.SequenceAlignment / CDHashTask

CDHashTask

Full name SMRUCC.genomics.Analysis.SequenceAlignment.CDHashTask Assembly SMRUCC.genomics.Analysis.SequenceAlignment Members 5

序列的 min-hash 签名计算任务(并行)

00 Remarks

计算过程已经改造为零堆分配:直接在序列字符串的字符区间上面用滑动窗口计算 MurmurHash, 不会再产生任何 Substring 或者 UTF8 byte[] 临时对象。

另外,因为「取最小值」操作对于集合与多重集是完全等价的,所以也不再需要 HashSet 对 k-mer 做去重。 在数百万条序列的数据集上面,这两项优化可以避免数十 GB 量级的临时内存分配。

01 Syntax

SMRUCC.genomics.Analysis.SequenceAlignment.CDHashTask

02 Methods

NameOverloadsSummary
RunDynamic 1 使用动态任务分片来并行执行 min-hash 计算
SolveRange 1 计算一个序列下标区间之内的 min-hash 签名
CreateSignature 1 直接在序列字符串上面通过滑动窗口生成 min-hash 签名
isAscii 1 序列之中是否全部都是 ASCII 字符?

03 Fields

NameOverloadsSummary
NumHashFunctions 1 min-hash 签名的长度(哈希函数的数量),与 MinHash.CreateSequenceData 的默认值保持一致

04 Members

method RunDynamic #
RunDynamic

使用动态任务分片来并行执行 min-hash 计算

Remarks

序列集合是按照长度降序排序的,如果使用 VectorTask 的静态分片方式, 尾部(下标最小)的工作线程会分到全部的最长序列,其耗时可能是其它工作线程的数倍, 整个阶段的耗时会被这个最慢的线程拖住(实测 4,042,313 条序列时差距达到 3.6 倍)。 这里改成动态的任务分片,让先完成的工作线程自动去领取下一段序列。

method SolveRange #
SolveRange(Int32, Int32)

计算一个序列下标区间之内的 min-hash 签名

Remarks

每一个工作线程写入的都是互不重叠的下标区间,所以这里不需要加锁, 也不需要先攒到一个临时的List再拷贝回来。

method CreateSignature #
CreateSignature(String, Int32)

直接在序列字符串上面通过滑动窗口生成 min-hash 签名

Remarks

与原实现 KSeq.KmerSpans(seq, k).CreateSequenceData(id, 100) 的数值结果完全一致:

  1. 原实现先把 k-mer 放进 HashSet 去重再取最小值,而最小值对于集合与多重集是完全等价的, 所以可以直接对每一个 k-mer 出现位置取最小值,省掉 HashSet 与 Substring;
  2. 对于 ASCII 序列,UTF8 编码的结果就是字符本身的值, 所以可以直接在字符区间上面计算哈希,省掉 byte[] 分配。
Parameters
NameTypeDescription
seqString

序列数据

kInt32

k-mer 的长度

Returns

长度固定为 CDHashTask.NumHashFunctions 的 min-hash 签名

method isAscii #
isAscii(String)

序列之中是否全部都是 ASCII 字符?

Parameters
NameTypeDescription
seqString

-

field NumHashFunctions #
NumHashFunctions

min-hash 签名的长度(哈希函数的数量),与 MinHash.CreateSequenceData 的默认值保持一致