一种生物基因序列的概要数据生成方法及系统

文档序号:96767 发布日期:2021-10-12 浏览:18次 >En<

阅读说明:本技术 一种生物基因序列的概要数据生成方法及系统 (Biological gene sequence summary data generation method and system ) 是由 刘卫国 林浩然 徐晓明 殷泽坤 于 2021-05-20 设计创作,主要内容包括:本公开提供了一种生物基因序列的概要数据生成方法及系统,获取待处理的基因序列;将待处理的基因序列利用滑动窗口进行K-mer分解,将M个K-mer及其对应的M个反向互补链的K-mer进行对比,对每对正向、反向K-mer,选取字符值较小的K-mer,最终得到M个K-mer,然后进行向量化转置操作;将转置操作得到的向量输入到基于单指令多数据流SIMD改进的哈希函数中,得到各个向量对应的哈希值;继续滑动窗口获取新的子序列K-mer,重复上述操作,直到待处理基因序列的所有K-mer都计算出对应的哈希值,根据所有的哈希值构建待处理基因序列的哈希值列表;根据哈希值列表,生成待处理的基因序列的概要数据;本公开采用向量化的实现方式,计算速度更快,能够实现生物基因序列的更高效处理。(The disclosure provides a method and a system for generating summary data of a biological gene sequence, which are used for acquiring a gene sequence to be processed; performing K-mer decomposition on a gene sequence to be processed by using a sliding window, comparing M K-mers and K-mers of corresponding M reverse complementary chains, selecting the K-mer with a smaller character value for each pair of forward and reverse K-mers to finally obtain M K-mers, and then performing vectorization transposition operation; inputting the vectors obtained by the transposition operation into a hash function improved based on Single Instruction Multiple Data (SIMD) to obtain hash values corresponding to the vectors; continuously sliding the window to obtain new subsequence K-mers, repeating the operation until all K-mers of the gene sequence to be processed calculate corresponding hash values, and constructing a hash value list of the gene sequence to be processed according to all the hash values; generating summary data of the gene sequence to be processed according to the hash value list; the method adopts a vectorization implementation mode, has higher calculation speed, and can realize more efficient processing of the biological gene sequence.)

一种生物基因序列的概要数据生成方法及系统

技术领域

本公开涉及生物数据处理

技术领域

,特别涉及一种生物基因序列的概要数据生成方法及系统。

背景技术

本部分的陈述仅仅是提供了与本公开相关的

背景技术

,并不必然构成现有技术。

随着测序技术的发展,生物基因数据库的规模越来越大。从刚开始的公开基因库数据总量不到五千万条核苷酸序列,到现如今一个测序仪器测序一次便可产生超过一万亿条序列,数据规模急剧增加,新测序技术的数据产生能力已经超越了“摩尔定律”。为了高效的处理基因数据,Mash、Dashing等工具相继被开发出来。在这类工具中,对于基因数据的处理转化为对基因序列中一系列公共子序列片段(K-mer,长度为K的子字符串)的处理。一般会应用均匀、确定性的哈希算法将这些子序列映射成哈希值,然后对哈希值进行处理,采用一定方法形成相应的sketch(即一个能够代表或者总结原始数据的紧凑的、近似的数据摘要),这个sketch相比于原基因数据要小得多,原基因数据可能有几个G的大小,而sketch仅有几KB或者几十KB,这样就达到了数据降维的效果。形成sketch后,后续利用不同序列的sketch进行比对,可以得到Jaccard系数、distance等,从而进行相应的研究。而MinHash、HyperLogLog是其中比较具有代表性的sketch算法。

Minhash最初是为了检测近乎重复的网页和图像而开发的,后应用于生物信息学领域。它依赖于哈希函数的均一性和确定性,即对于输入的一系列数据经过哈希函数之后,需要均匀随机的分布在输出数据的范围之内,并且对于相同的输入应该保证有相同的输出。MinHash算法处理序列数据的方式是对每条序列构建一个sketch集合,通过集合之间的Jaccard相似性来估计序列的相似性。其对序列数据的处理方式更详细一些的描述为通过滑动窗口的方式,将序列切分为一个个的K-mer,通过哈希函数将K-mer作为输入,输出为一个哈希值,这就完成了字符串到整数的映射。所有得到的哈希值构建成一个集合,通过对于这些集合之间相似性的计算来代表原始序列的相似性。但是由于全部的K-mer所映射的哈希值所构成的集合大小和序列长度呈线性关系,所以为了达到对数据量的压缩目的,对两条序列所对应的全部哈希值所构成的集合进行计算Jaccard相似度的时候,如果两个集合是通过相同的哈希函数构建出来的,根据哈希函数的均一性和确定性,经过哈希映射之后的哈希值在集合中的分布是随机的,于是两个集合拥有相同的最小哈希值的概率和两个集合交集的大小与并集大小的比值是相等的,两个集合之间交集和并集的比值正是Jaccard相似性的定义。这也是MinHash的基本思路。

基于HyperLogLog的sketch算法近年来也被应用于生物序列分析之中,HyperLogLog是基于数据位模式(bit-pattern)来估计集合的势(集合中元素的个数)。HyperLogLog的思想就是通过一个具有均一性和确定性的哈希函数对原始数据求哈希值,然后通过哈希值中最长的前导零加一个1的值去估计集合中有多少个不同的元素。构建sketch时,先对于序列中的每个元素K-mer计算哈希值,然后取出这个哈希值的前缀p位作为sketch中的索引,索引到寄存器数组相应的位置处,剩余的q位根据前导零的个数去估计每个寄存器集合的大小。当获得一个新的更长的前导零,就更新当前寄存器中的数据。最后通过对每个寄存器存储的值求调和平均数来估计原始集合势的大小。

发明人发现,在Minhash sketch和HyperLogLog sketch相关应用中,对于哈希值的计算是其中的计算密集区域之一,整个程序的性能受限于对于哈希值的求解,目前还缺少性能更优的求解方法;同时,在哈希函数计算之前,对于输入内容K-mer的整理和哈希函数计算之后对于哈希值列表的处理是程序另外的热点部分,现有sketch算法缺乏对哈希求解前和求解后的数据优化处理。

发明内容

为了解决现有技术的不足,本公开提供了一种生物基因序列的概要数据生成方法及系统,基于单指令多数据流SIMD改进的多种哈希函数建基因序列的哈希值列表,采用向量化的实现方式,计算速度更快,能够实现生物基因序列的更高效处理。

为了实现上述目的,本公开采用如下技术方案:

本公开第一方面提供了一种生物基因序列的概要数据生成方法。

一种生物基因序列的概要数据生成方法,包括以下过程:

获取待处理的基因序列;

将待处理的基因序列利用滑动窗口进行K-mer分解,每次按顺序切分出一个定长K-mer,并得到其基因序列的反向互补链,将M个K-mer以及其反向互补链的K-mer分别封装进向量,采用二进制掩码形式将正向K-mer和反向K-mer进行向量化对比,留下字符值较小的K-mer,将留下的M个K-mer进行向量化转置操作;

将转置操作得到的向量输入到基于单指令多数据流SIMD改进的哈希函数中,得到各个向量对应的哈希值;

继续滑动窗口获取新的子序列K-mer,重复上述操作,直到待处理基因序列的所有K-mer都计算出对应的哈希值,根据所有的哈希值构建待处理基因序列的哈希值列表;

根据哈希值列表,生成待处理的基因序列的概要数据。

进一步的,将输入的转置之后的M个向量,以32位或64位的整数倍为一个单位再次进行划分,每个向量每满N位,就单独划分出来进行一组向量化的位运算操作,其中N为32或64的整数倍;

所有满N位的部分处理完毕,最后剩余的不足N位的tail部分进行单独的向量化的位运算操作;

将运算结果进行整合得到结果向量,将得到的结果向量通过相应指令解析得到M个序列的哈希值。

进一步的,将M个K-mer数据载入M个向量中,利用向量化方式进行转置操作。

进一步的,对tail部分的数据,采用对应的掩码将switch语句替换。

进一步的,哈希函数计算过程中,利用多路展开并行操作进行填充。

进一步的,采用Minhash sketch算法生成概要数据。

更进一步的,K-mer输入到哈希函数之前,在正向Kmer和反向Kmer对比过程中,采用位操作的方式代替switch语句。

更进一步的,K-mer输入到哈希函数之前,基于SIMD改进得到K-mer对比算法,利用二进制掩码,采用向量化指令进行比较。

更进一步的,生成哈希值列表之后,在优先队列的实现过程中采用robin-hood-hashing来代替unordered_map方法。

进一步的,采用Hyperloglog sketch算法生成概要数据。

更进一步的,在sketch生成阶段distance阶段采用OpenMP多线程。

更进一步的,对于并集集合,在内部循环中使用单指令多数据流对多个相邻操作数的向量执行算术和位运算。

本公开第二方面提供了一种生物基因序列的概要数据生成系统。

一种生物基因序列的概要数据生成系统,包括以下过程:

数据获取模块,被配置为:获取待处理的基因序列;

K-mer分解模块,被配置为:将待处理的基因序列利用滑动窗口进行K-mer分解,每次按顺序切分出一个定长K-mer,并得到其基因序列的反向互补链,将M个K-mer以及其反向互补链的K-mer分别封装进向量,采用二进制掩码形式将正向K-mer和反向K-mer进行向量化对比,留下字符值较小的K-mer,将留下的M个K-mer进行向量化转置操作;

哈希计算模块,被配置为:将转置操作得到的向量输入到基于单指令多数据流SIMD改进的哈希函数中,得到各个向量对应的哈希值;

哈希值列表生成模块,被配置为:继续滑动窗口获取新的子序列K-mer,重复上述操作,直到待处理基因序列的所有K-mer都计算出对应的哈希值,根据所有的哈希值构建待处理基因序列的哈希值列表;

概要数据生成模块,被配置为:根据哈希值列表,生成待处理的基因序列的概要数据。

本公开第三方面提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时实现如本公开第一方面所述的生物基因序列的概要数据生成方法中的步骤。

本公开第四方面提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的程序,所述处理器执行所述程序时实现如本公开第一方面所述的生物基因序列的概要数据生成方法中的步骤。

与现有技术相比,本公开的有益效果是:

1、本公开所述的方法、系统、介质或电子设备,基于单指令多数据流SIMD改进的多种哈希函数建基因序列的哈希值列表,采用向量化的实现方式,计算速度更快,能够实现生物基因序列的更高效处理。

2、本公开所述的方法、系统、介质或电子设备,采用将M个数据载入M个向量中的形式,然后利用向量化手段对其进行转置操作,造成M个数据无法全部载入且无法取得M个数据相同位置处的32/64位的问题。

3、本公开所述的方法、系统、介质或电子设备,利用相应的掩码将switch语句替换掉,避免了分支预测失效,并使其能够充分利用向量化操作,大大提升了程序性能。

4、本公开所述的方法、系统、介质或电子设备,利用多路展开并行操作进行填充,使得依赖降低,进一步提升了哈希函数的性能。

附图说明

构成本公开的一部分的说明书附图用来提供对本公开的进一步理解,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。

图1为本公开实施例1提供的现有技术中的Minhash sketch方法流程图。

图2为本公开实施例1提供的改进的Minhash sketch方法流程图。

图3为本公开实施例1提供的现有技术中的Hyperloglog sketch方法流程图。

图4为本公开实施例1提供的改进的Hyperloglog sketch方法流程图。

具体实施方式

下面结合附图与实施例对本公开作进一步说明。

应该指出,以下详细说明都是例示性的,旨在对本公开提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本公开所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本公开的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。

在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。

实施例1:

本公开实施例1提供了一种生物基因序列的概要数据生成方法,对于哈希值的计算,本实施例提供了基于单指令多数据流SIMD改进的多种哈希函数,包括MurmurHash3、CityHash、xxHash、wangHash,利用这些哈希函数构建基因序列的哈希值列表,针对不同情况选择不同哈希函数,使适用性更广;采用向量化的实现方式,使其速度更快。

原始哈希函数计算哈希值的方法如下:

对于待处理的序列数据,利用滑动窗口生成一个K-mer,然后对该K-mer进行处理,获得其反向互补链(DNA一般呈现双链结构,是由两条单链盘绕形成的,两条单链具有互补特性,即每两个碱基之间组成碱基对,这种配对具有特异性,即A只能与T形成配对,C只能与G形成配对,称为碱基的互补配对。其中两条互补的单链在方向上是相反的,每条单链称为另一条单链的反向互补链),然后两K-mer对比,获得字符值较小的K-mer,然后将此K-mer传入哈希函数进行操作,将其分成body部分和tail部分,分别进行处理。在之后,原始算法对body部分每次处理32/64位的整数倍,剩下的不足以构成32/64位整数倍的,作为tail部分单独进行处理,对其进行移位操作然后再进行相应的位运算。

例如一个K-mer,k=21,其转化为二进制为168位,假设哈希函数每次操作64位,则body部分为前128位,每次处理64位,tail部分为剩余的40位,对其移位,达到补零补充到64位的效果,再进行相应的位运算,最终获得相应的哈希值。

本实施例中,针对已有的hash算法进行了单指令多数据流(SIMD)的向量化操作,具体实现如下:

获取待处理的基因序列;

将待处理的基因序列利用滑动窗口进行K-mer分解,每次按顺序切分出一个定长K-mer,并得到其基因序列的反向互补链,然后将M个K-mer以及其反向互补链的K-mer分别封装进向量,采用二进制掩码形式将正向K-mer和反向K-mer进行向量化对比,即对于每对正向、反向K-mer,选取其中字符值较小的K-mer,最终留下了M个字符值较小的K-mer,将留下的M个K-mer进行向量化转置操作;

选取合适的哈希函数,将转置操作得到的向量输入到基于单指令多数据流SIMD改进的哈希函数中;

将输入的转置之后的M个向量根据不同哈希函数的特点,以32/64位的整数倍为一个单位再次进行划分,因为M个K-mer是等长的,所以这M个向量能够找到一个统一的二次划分:每个向量每满N位(N为32/64的整数倍)就单独划分出来进行一组向量化的位运算操作;

所有满N位的部分处理完毕,最后剩余的不足N位的部分(即tail部分)进行单独的向量化的位运算操作;

将运算结果通过向量化技术进行整合,然后将得到的结果向量通过相应指令解析得到M个序列的哈希值并存储;

继续滑动窗口获取新的子序列K-mer,重复上述操作,直到待处理基因序列的所有K-mer都计算出对应的hash值,从而构建出待处理基因序列的哈希值列表。

一般M的取值为8,K-mer的默认长度为21.对于序列可以设定不同的K-mer长度,从而切分出的K-mer数量也不一样。

本实施例中还采用了如下改进:

(1)原始哈希函数每次接收一个数据,而基于SIMD的哈希函数要求一次性处理M个数据,因此需要对数据的输入进行合并,将其载入成向量的形式。并且原始哈希函数计算过程中是分为body和tail部分,tail部分单独处理,body部分以32/64位为一个基本操作单位,多次循环进行处理。因此基于SIMD的哈希函数在body部分也必须一次性处理M*(32/64)位,且必须是这M个数据中的每个数据相同位置处的32/64位,也就是说第一个向量载入的应该是这M个数据的前32/64位。但是如果按照原本向量的载入形式,那么其会从头开始载入,载入第一个数据、第二个数据···,由于最多载入512bit,由于一个数据一般会超过64bit,这就势必造成M个数据无法全部载入,且无法取得M个数据相同位置处的32/64位。所以载入的数据必须进行重构。

本实施例中,采用将M个数据载入M个向量中的形式,然后利用向量化手段对其进行转置操作,解决了上述问题。

(2)原始哈希函数单独处理tail部分的数据,一般采取switch-case分支判断方式,这很可能带来很大的开销。

本实施例利用相应的掩码将switch语句替换掉,避免了分支预测失效,并使其能够充分利用向量化操作,大大提升了程序性能。

(3)哈希函数计算过程中存在一定的依赖关系,这种依赖关系会降低向量化指令的速度。本实施例利用多路展开并行操作进行填充,使得依赖降低,进一步提升了函数的性能。

形成sketch的算法过程中,Minhash sketch和Hyperloglog sketch关于哈希值的计算部分是一致的,在其之后的部分有所不同。

如图1所示,其中Minhash sketch原始算法后续流程为:

获取一个待处理基因序列的哈希值列表;

选定合适的sketch大小s,用优先队列对哈希值列表进行处理,获取s个最小的哈希值,形成该基因序列的sketch;如果需要更新当前sketch,需要将两次获得的最小哈希值列表进行合并,重新选取最小的s个值作为新的sketch。

重复上述步骤,直到待处理基因序列都形成所对应的sketch;

形成sketch后,本实施例可以进行多方面利用,比如比较两个基因序列所对应的各自的sketch,求二者的Jaccard系数,即求|S(A∪B)∩S(A)∩S(B)|与|S(A∪B)|的比值,这是Jaccard系数的无偏估计。

其中,S(A)表示基因序列A的sketch,S(B)表示基因序列B的sketch,S(A∪B)表示两个sketch的并集中s个最小的哈希值所重新形成的一个集合。

根据Minhashsketch计算Jaccard系数等,进而判断其相似度。Sketch方法在基因组组装、对宏基因组样本做聚类,亦或者使用不同平台测序数据(拼接好的和未拼接的)实时搜索基因数据库等方面中都得到有效利用。

除了哈希函数的优化,对于哈希函数的输入数据的整理和输出哈希值列表的处理还包括如下改进,如图3所示:

(1)K-mer传入哈希函数之前,需要求其反向互补链,在生成反向互补链部分,原始算法(如图1)流程中是通过switch-case分支语句预测来构成反向互补链的,而这部分预测错误会有惩罚,带来性能下降。

本实施例改进了原始算法的switch-case分支语句预测,本实施例采用位操作的方式代替switch语句,避免了分支预测失效,极大地提高了反向互补链的生成速度。

(2)K-mer传入哈希函数之前,得到反向互补链之后,还需要对其进行对比,求得字符值较小的K-mer,然后将此K-mer传入哈希函数求取哈希值。正向K-mer与其反向互补链K-mer比较的部分,原始算法中是调用memcmp函数来进行对比,从而留下字符值小于预设值的K-mer。

但是逐个对比速度会比较慢,本实施例基于SIMD改进得到性能更好的K-mer对比算法,即前面哈希函数算法优化中所述,利用二进制掩码,采用向量化指令进行比较,获得了较好的性能加速比。

(3)哈希函数生成哈希值列表之后,在优先队列的实现过程中采用robin-hood-hashing来代替unordered_map方法,提高构建过程中所用的数据结构的性能。

(4)对于生成sketch之后的后续应用中,如果求Mash距离,原始算法采用基于merge的算法,而本实施例采用基于block的思想,扩展了原始算法,使其速度更快。

(5)不同的序列构建sketch的过程没有相互依赖,可以采用多线程实现,在多核平台上,应该将数量设置为可用的最大CPU核数,以获得最佳性能,并且线程亲和性和线程绑定模式上,本实施例采用compact或者scatter模式会比defult模式拥有更佳的性能。

如图2所示,HyperLogLog sketch原始算法流程为:

获取一个待处理基因序列的哈希值列表;

构建大小为m的HLL数组,初始值为0,对哈希值列表进行处理,将每个哈希值分为前缀p和后缀q,前缀p索引数组位置,后缀q计算该位置处的LZC(前导0计数,即q中从左到右直到遇到最左边的1为止的位数),然后与数组该位置处已存储的LZC进行对比,留存较大的LZC值,最终得到数组该位置处最大的LZC值即LZCmax。处理完哈希值列表,得到HyperLogLog的sketch;

重复上述步骤,直到待处理基因序列都形成所对应的sketch;

形成sketch后,本实施例可以利用形成的sketch,估计计算不同集合的基数,其公式为:

其中,E为估算的基数,m为数组的大小,αm为校正因子,中Mj为1+LZCmax,还可以求两个基因序列的Jaccardindex,获得其相似度,可用于一系列聚类等操作。

对于其中的性能优化部分,除了如上所述的哈希函数优化部分,还包括如下改进,如图4所示:

(1)本实施例使用了OpenMP多线程,形成sketch和求其distance阶段都很容易扩展到100个线程,并且获得了较好的加速比。

(2)在应用部分,实现了基于单指令多数据流SIMD的优化。在算法之中,对于并集和交集基数的估计是相似性度量的重要组成部分,对其进行优化能很好的加快速度。因此,对于集合并集,在内部循环中使用单指令多数据流(SIMD),能够对多个相邻操作数的向量执行快速算术和位运算,将重要的循环使用SIMD指令,从而加快了速度,采用基于AVX512的指令集会比基于SSE2指令集提速20%左右。对集合基数和集合交集基数的统计过程很难用此方法,使用手动循环展开来加速这些内部循环。

实施例2:

本公开实施例2提供了一种生物基因序列的概要数据生成系统,包括以下过程:

数据获取模块,被配置为:获取待处理的基因序列;

K-mer分解模块,被配置为:将待处理的基因序列利用滑动窗口进行K-mer分解,每次按顺序切分出一个定长K-mer,并得到其基因序列的反向互补链,将M个K-mer以及其反向互补链的K-mer分别封装进向量,采用二进制掩码形式采用二进制掩码形式将正向K-mer和反向K-mer进行向量化对比,即对于每对正向、反向K-mer,选取其中字符值较小的K-mer,最终留下了M个字符值较小的K-mer,将留下的M个K-mer进行向量化转置操作;

哈希计算模块,被配置为:将转置操作得到的向量输入到基于单指令多数据流SIMD改进的哈希函数中,得到各个向量对应的哈希值;

哈希值列表生成模块,被配置为:继续滑动窗口获取新的子序列K-mer,重复上述操作,直到待处理基因序列的所有K-mer都计算出对应的哈希值,根据所有的哈希值构建待处理基因序列的哈希值列表;

概要数据生成模块,被配置为:根据哈希值列表,生成待处理的基因序列的概要数据。

所述系统的工作方法与实施例1提供的生物基因序列的概要数据生成方法相同,这里不再赘述。

实施例3:

本公开实施例3提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时实现如本公开实施例1所述的生物基因序列的概要数据生成方法中的步骤。

实施例4:

本公开实施例4提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的程序,所述处理器执行所述程序时实现如本公开实施例1所述的生物基因序列的概要数据生成方法中的步骤。

本领域内的技术人员应明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(RandomAccessMemory,RAM)等。

以上所述仅为本公开的优选实施例而已,并不用于限制本公开,对于本领域的技术人员来说,本公开可以有各种更改和变化。凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。

15页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:产品成分标识生成方法、装置、计算机设备和存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!