本发明涉及g06f17/30,g06f17/00,g06f17,g06f领域,特别是一种基于内存运算的快速获取文件增量方法。
背景技术:
在etl过程中,获取增量数据是一项非常关键的操作环节,常规方法是将新数据装载入数据库后进行增量剥离操作,此方法消耗大量昂贵的数据库资源,运算速度慢且接口升级需对数据库内的增量剥离程序进行修改,人工介入多,开发压力较大。
技术实现要素:
本发明的目的是为了解决上述问题,设计了一种基于内存运算的快速获取文件增量方法。
实现上述目的本发明的技术方案为,一种基于内存运算的快速获取文件增量方法,该增量方法包括:将旧文件按行提取特征值后写入内存中特定的数据结构中,再将新文件按同样算法提取特征值后在内存中查询,特征值的算法、数据结构的设计和避免冲突。
所述该增量方法包括以下步骤:
步骤一,选取2个需要获取增量的文件。(旧文件以下称为a文件,新文件称为b文件,增量文件为c文件)
步骤二,在内存中构建32叉深度为d的tiretree,具体深度可按文件大小或硬件环境进行合理选择,推荐深度值为4~6。
步骤三,将a文件按行取hash值,根据内存和文件大小选取hash值中的d(4~6)位作为tiretree索引,根据索引逐条找到tiretree的叶子节点指针。
步骤四,在叶子节点处创建文本信息节点,将各行文本的hash值和一部分原始文本存入文本信息节点中,其中cahash用来保存散列值,h的大小最好为所采用的散列算法计算出的尽可能长的字符串,推荐采用16~24位,camsg用来保存部分原始文本信息,建议取原始文本信息的前m位,m的大小推荐采用4~8。
步骤五,依次将整个文件各行的hash值和部分原始文本依次存入文本信息节点中,若出现冲突则以链表的形式将文本信息节点进行组织,采用链表避免了冲突,能够节约部分内存,如对运算速度要求高且在内存充足的前提下,可以将文本信息节点以二叉树的链表表示法进行组织,但会增加10%~16%内存的消耗。
步骤六,将b文件按同样算法计算每行的hash值,使用同样d值(4~6)在tiretree中查询节点。
步骤七,将字符串s输出至文件c中。
所述步骤六查询到节点的步骤为:
(1)读取b文件某行记录,存入字符串变量s。
(2)取s的hash值shash,使用同样d值(4~6)作为索引在tiretree中查询文本信息。
(3)若文本信息节点中的cahash与shash一致,且文本信息节点中的camsg与s的前m位一致,则可判断为b文件中的s记录行在a文件中存在。
(4)若采用shash在tiretree和文本信息节点中查询得到空指针,或文本信息节点中的cahash与一致shash但camsg与s的前m位不一致,则跳过可确定为b文件中的s记录行在a文件中不存在,此行即增量信息。
利用本发明的技术方案制作的一种基于内存运算的快速获取文件增量方法,与现有技术相比,本发明的有益效果是:增量运算速度快,比现有在数据库内运算快40倍左右,大数据量增量获取尤为明显,准确可靠,不会出现增量获取失败或重复的问题,内存消耗少,理论上1g内存支持两个不超过3890万行记录的文件进行增量比对,并行多个任务运算性能不会明显降低,能解决现有技术中依赖数据库运算增量的各种弊端。
具体实施方式
下面结合附图对本发明进行具体描述,如图1-6所示。
步骤一,选取2个需要获取增量的文件。(旧文件以下称为a文件,新文件称为b文件,增量文件为c文件)
步骤二,在内存中构建32叉深度为d的tiretree,具体深度可按文件大小或硬件环境进行合理选择,推荐深度值为4~6。
tiretree的数据结构如图1所示:
步骤三,将a文件按行取hash值,根据内存和文件大小选取hash值中的d(4~6)位作为tiretree索引,根据索引逐条找到tiretree的叶子节点指针。
tiretree如图2所示(n=32):
步骤四,在叶子节点处创建文本信息节点,将各行文本的hash值和一部分原始文本存入文本信息节点中,其中cahash用来保存散列值,h的大小最好为所采用的散列算法计算出的尽可能长的字符串,推荐采用16~24位,camsg用来保存部分原始文本信息,建议取原始文本信息的前m位,m的大小推荐采用4~8。
如图3所示:
步骤五,依次将整个文件各行的hash值和部分原始文本依次存入文本信息节点中,若出现冲突则以链表的形式将文本信息节点进行组织,采用链表避免了冲突,能够节约部分内存,如对运算速度要求高且在内存充足的前提下,可以将文本信息节点以二叉树的链表表示法进行组织,但会增加10%~16%内存的消耗。
如图4所示:
步骤六,将b文件按同样算法计算每行的hash值,使用同样d值(4~6)在tiretree中查询节点,查询到节点的步骤为:
(1)读取b文件某行记录,存入字符串变量s。
(2)取s的hash值shash,使用同样d值(4~6)作为索引在tiretree中查询文本信息。
(3)若文本信息节点中的cahash与shash一致,且文本信息节点中的camsg与s的前m位一致,则可判断为b文件中的s记录行在a文件中存在。
(4)若采用shash在tiretree和文本信息节点中查询得到空指针,或文本信息节点中的cahash与一致shash但camsg与s的前m位不一致,则跳过可确定为b文件中的s记录行在a文件中不存在,此行即增量信息。
步骤七,将字符串s输出至文件c中。
装载旧文件处理流程如图5所示:
得到增量的处理流程如图6所示:
本实施方案的特点为,该增量方法包括:将旧文件按行提取特征值后写入内存中特定的数据结构中,再将新文件按同样算法提取特征值后在内存中查询,特征值的算法、数据结构的设计和避免冲突,增量运算速度快,比现有在数据库内运算快40倍左右,大数据量增量获取尤为明显,准确可靠,不会出现增量获取失败或重复的问题,内存消耗少,理论上1g内存支持两个不超过3890万行记录的文件进行增量比对,并行多个任务运算性能不会明显降低,能解决现有技术中依赖数据库运算增量的各种弊端。
上述技术方案仅体现了本发明技术方案的优选技术方案,本技术领域的技术人员对其中某些部分所可能做出的一些变动均体现了本发明的原理,属于本发明的保护范围之内。