多集合元素去重并标识所属集合的过滤系统及其方法与流程

文档序号:12038900阅读:140来源:国知局
本发明涉及IT
技术领域
的多集合元素过滤器技术,尤其涉及多集合元素去重并标识所属集合的过滤系统及其方法。
背景技术
:目前在IT
技术领域
存在很多比较两个对象(如软件、文档等)是否完全相同的方法。例如:将数据二进制化后,按位进行比较。这是最原始的,也是最费时的一种做法。在数据很大的情况时,我们可以改进,将这些数据计算出一个数据指纹,在保证其唯一性不变的前提下进行比较。这是一种元素间比较的方法,在适用范围上很有局限性,并且即使使用了数据指纹缩小了所比较数据的大小,但是当处理海量数据的时候,使用数据指纹在保证唯一性前提的时候,也会造成庞大的系统资源占用。再者,还需要额外的业务逻辑收集元素,封装为集合然后去进行逐一比较。或者,还可以利用一些数据结构进行去重。一般是将所有元素保存起来,然后通过比较确定。利用链表、树、散列表(Hashtable,又叫哈希表)等数据结构均属于这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为O(n),O(logn),O(n/k)。但是对于多集合去重,依然需要对这些底层方法进行封装和业务逻辑的重新构建组合才能实现,并且维护多个集合在内存的占用,在数据已达TB级别的今天不是十分便利。以上的这些方法可以去掉重复的元素,但是对于我们了解更多的集合信息却没有帮助。有时候我们想知道某个元素在哪些集合中出现过,想对出现这个元素的集合进行一些特殊操作,这些都需要我们进行额外的设计和编码来达到目的。技术实现要素:有鉴于此,本发明的主要目的在于提供一种多集合元素去重并标识所属集合的过滤系统及其方法,其基于布隆(Bloom)过滤器设计,只需现有哈希表的1/8到1/4大小即可解决相同的问题,还能够大幅降低系统资源的占用率,而且可结合消息摘要算法第五版(MD5,Message-DigestAlgorithm5)使用,能够将很多数据按照等长的字节作为训练布隆过滤器的输入。由于布隆过滤器具有排重速度快的优点,每一个集合对应一个布隆过滤器,在比较时按照一定次序进行比较,集合n的某一个元素,最多只需要在它之前的n-1个集合中进行排重,毋需再对所有集合进行排重操作。为达到上述目的,本发明的技术方案是这样实现的:一种多集合元素去重并标识所属集合的过滤系统,该过滤系统主要包括:读取模块,用于本地磁盘的布隆Bloom过滤器的读取和属性properties文件的读取;写出模块,用于向磁盘写Bloom过滤器和属性properties文件;Bloom过滤器构建模块,用于Bloom过滤器的构建和从内存队列中存取Bloom对象;标识模块,用于标识出现过特定元素的集合和标识所述Bloom过滤器属于哪个集合。其中:所述读取模块能够根据内存环境进行自动读取。所述写出模块在内存数据量达到预设值时写出以减少写出次数。进一步包括:为队列数据结构构建一个缓存,以方便所述队列中的对象调出,当使用完后再加入队尾。将所述properties文件转化为内存的k/v数据结构进行比较。一种多集合元素去重并标识所属集合的过滤方法,主要包括:A、从集合n输入元素a;B、对所述集合n的数据进行MD5转化;C、从内存查找是否包含有布隆Bloom过滤器Filter,如果没有,则执行步骤D;若有,则转到步骤G;D、从本地磁盘加载预先序列化的BloomFilter对象,并判断是否读取到BloomFilter,若否,则执行步骤E;若是,执行步骤F;E、创建一个BloomFilter对象,并且为他分配一个集合的唯一标识;然后执行步骤F;F、将所述BloomFilter放入内存队列,然后执行步骤G;G、判断内存队列的BloomFilter是否包含元素a,若是,则执行步骤H;否则,执行步骤I;H、修改properties文件中的记录,然后执行步骤J;I、将该元素a加入到自身BloomFilter,并进行更新,标识该Bloom过滤器;然后执行步骤J;J、判断集合n的所有元素作为输入是否都过滤完毕,如果否,则返回步骤B;如果是,则执行步骤K;K、以集合n的唯一标识为文件名记录一个properties文件,其中键为元素名,值为集合n的标识。其中:步骤G之前进一步包括:当含元素a的集合的MD5化字符串到达内存中的Bloom过滤器队列时,先依次拿出集合1...n-1个过滤器,看这些过滤器是否包含元素a。步骤H具体包括:当在第n-k个集合中发现元素a包含在该集合中,则将元素a在集合n-k里面重复的信息记录在相应的properties文件中,其中,键为元素名,并将集合n的标识追加到值的末尾,所述n>k>0。本发明所提供的多集合元素去重并标识所属集合的过滤系统及其方法,具有以下优点:1)本发明的所述过滤系统,具有在多个集合中采取尽可能快速、系统资源少的情况下排除重复元素的优点。现有技术在多集合排重时,需要利用一些基本的代码比较方法或者使用一些数据结构,再加上一些重新设计的业务逻辑来实现,在选择数据结构选择和业务逻辑的设计上的欠妥都会造成效率低下和系统资源占用大的问题。本发明过滤系统实现了以Bloom过滤器为基础的内存队列结构,按照一定次序,让集合的某个元素在它之前的所有集合对应的Bloom过滤器中进行排重,在均不重复的情况下作为自己Bloom过滤器的输入来进行构造,减少了排重的次数,使用的Bloom过滤器本身又是最节约空间的,它只需要现有哈希表1/8到1/4的大小即可解决相同的问题。2)本发明的过滤系统,能够标识出元素曾在哪些集合中出现过,以便对出现这个元素的集合进行一些特殊操作。通过对每个集合都分配一个唯一的标识符,当元素在排重到某一个Bloom过滤器发现已经重复,那么就停止,并且记录下这个Bloom过滤器的标识和元素所在过滤器的标识,最终将这些记录合并,得到一个属性(properties)文件(文件名为Bloom过滤器的标识)、键是元素、值是所属的集合标识序列。附图说明图1为本发明多集合元素并标识所属集合的过滤系统的功能结构示意图;图2为本发明多集合元素并标识所属集合的过滤方法流程示意图。具体实施方式下面结合附图及本发明的实施例对本发明的过滤系统及其方法作进一步详细的说明。本发明多集合元素并标识所属集合的过滤系统的作用不仅仅局限于将众多集合中重复元素去掉,还专注于知道这些重复元素都在那些集合中出现。其主要思想为:在初次拿到集合1,将里面的元素转化为一个MD5字符串,再将MD5字符串作为布隆(Bloom)过滤器的输入,训练出一个Bloom过滤器;所述布隆过滤器,是一个很长的二进制向量和一系列随机映射函数。Bloom过滤器可用于检索一个元素是否在一个集合中,还可以用来实现数据字典,进行数据的判重,或者进行集合求交集。Bloom过滤器的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bitarray)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。训练完成后,放入到内存队列中,将Bloom过滤器按照集合1的唯一标识持久化到本地硬盘中,便于后面使用。当初次拿到集合2时,它的第一个元素进来,首先在集合1中判断是否重复,如果重复则记录下这个元素为集合1与集合2共有的元素,如果不重复则用来训练集合2的Bloom过滤器,训练完毕后,再按照集合2的唯一标识进行持久化。如此循环到集合n。以后当所述集合的数据有更新时,按照顺序从硬盘读取Bloom过滤器进行去重操作。图1为本发明多集合元素并标识所属集合的过滤系统的功能结构示意图。如图1所示,所述过滤系统主要包括读取模块11、写出模块12、Bloom过滤器构建模块13以及标识模块14。其中:读取模块11,主要用于本地磁盘的Bloom过滤器的读取和属性(properties)文件的读取。首先系统会从默认的系统坐标地址去查找是否存在这样一个文件,Bloom过滤器和属性(properties)文件都会以文件的形式保存到一个当前系统的相对路径,根据文件是否存在决定下一步的执行逻辑,如果有则读取放入内存,如果没有,则创建一个备用。写出模块12,主要用于向磁盘写Bloom过滤器和属性(properties)文件。当所有几何全部元素过滤完毕之后,会将内存队列中的Bloom过滤器拿出来序列化到磁盘。当每个集合过滤完毕之后,会将这个集合里面所有元素,以元素名为键,集合标识为值的K/V形式分别更新到以集合标识为名的properties文件中,写出的次数为n(n+1)/2,其中:n为集合的数目。Bloom过滤器构建模块13,主要用于Bloom过滤器的构建和从内存队列中存取Bloom对象。从内存中取到Bloom过滤器,将其按照一定的顺序放入到队列当中,当使用的时候从队头取出,使用完毕之后再加入队尾,并且如果在Bloom过滤器当中没有这个元素,则需要将这个元素加入Bloom过滤器,使他更新。标识模块14,主要用于标识元素在哪些集合中出现过和标识所述Bloom过滤器属于哪个集合。具体地:标识模块14用来从properties文件中提取出键值信息,统计出某一个元素到底在那些集合中出现过,properties文件在过滤结束之后,会出现一个结果。例如:元素a,记录的形式a=集合1的标示符,集合2的标示符…,通过这个形式,我们很容易知道我们想要的结果。标识Bloom过滤器,只需要在序列化到硬盘的时候给过滤器分配一个唯一的名称,以及在内存队列中的位置,例如:集合1_次序3。下面介绍该过滤系统的几个典型应用场景:应用场景一:基于爬虫技术的快照文件过滤系统。在爬取办公自动化(OA)系统时,需要以用户的身份分别爬取系统,每个用户的系统中存在着大量的公有文件和私有文件,或者存在部分用户公有的文件。如果全部每个用户下载一份,存在大量的重复文件,不仅浪费了磁盘输入输出(IO)资源以及磁盘、闪存等的存储空间,还会导致每次爬取的时间加长。而利用本发明,当爬虫按照user1下载这个权限下的文件,可以把这个权限下的文件作为一个集合,其中的文件作为集合中的一个元素。当然还有user2,user3等。他们之间有很多公有的文件,当user1每下载一个文件就可以构建Bloom过滤器,首先自身不会再向磁盘写入重复文件。当爬虫下载user2时(作为集合2),首先它可以拿user1的过滤器判断自己哪些文件是user1已经下载过的,如果下载过了,那么它就不用再下载,这样就节省了磁盘IO资源和下载时间;把那些重复的文件的标识记录在一个user1的属性(properties)文件中,通过这种方式,当我们分析properties文件时,就知道某个文件在被哪些用户拥有。然后将不重复的文件作为自己私有文件构建自己的Bloom过滤器,供后面的user使用。循环到最后一个user的最后一个文件。将节约最多的磁盘空间,每个文件都只有一个拷贝,并且还保留了这个文件的所属信息。应用场景二:去除电脑中的重复文件。电脑硬盘上存有很多文件夹,是经过分类的,文件夹相互可能会有部分的重复数据,如果需要去掉重复的数据以节省存储空间,又不想通过合并这些文件夹的方式来实现,这时候就可以将本发明的技术方案稍加改进即可使用。将每个文件夹看作一个集合,文件夹里中的文件是一个元素,首先遍历目录Dir1,将每个元素作为输入,构建Bloom过滤器,首先可以去掉自身文件夹下面,命名不同但是内容相同的文件。当遍历目录Dir2、Dir3时,可以对照之前的Bloom过滤器将本文件夹中的重复文件做删除操作,最终所有文件夹中的重复文件都去除,并且留下了删除的文件记录。图2为本发明多集合元素并标识所属集合的过滤方法流程示意图。通过MD5算法将去重的基本数据类型转换为统一的字串以方便比较,设定所述字串为唯一;采用properties文件记录信息,并通过分析所述properties文件来达到去重和标识的作用;按照内存队列的顺序与排在目标元素所属集合之前的集合进行比较,再配合所述properties文件进行分析。如图2所示,该方法具体包括如下步骤:步骤201:从集合n输入元素a。步骤202:对所述集合n的数据进行MD5转化。步骤203:从内存查找是否包含有布隆(Bloom)过滤器(Filter),如果没有,则执行步骤204;若有,则转到步骤207。步骤204:从本地磁盘加载预先序列化的Bloom过滤器对象,并判断是否读取到布隆(Bloom)过滤器(Filter),若否,则执行步骤205;若是,执行步骤206。步骤205:创建一个Bloom过滤器对象,并且为他分配一个集合的唯一标识;然后执行步骤206。步骤206:将所述Bloom过滤器放入内存队列,然后执行步骤207。步骤207:判断内存队列的Bloom过滤器是否包含元素a,若是,则执行步骤208;否则,执行步骤209。这里,当含元素a的集合的MD5化字符串到达内存中的Bloom过滤器队列时,先依次拿出集合1...n-1个过滤器,看这些过滤器是否包含元素a。步骤208:修改properties文件中的记录,然后执行步骤210。例如,当在第n-k(n>k>0)个集合中发现元素a包含在这个集合中,则将元素a在集合n-k里面重复的信息记录在相应的properties文件中,其中,键为元素名,并将集合n的标识追加到值的末尾。步骤209:将该元素a加入到自身Bloom过滤器,并进行更新,标识该Bloom过滤器;然后执行步骤210。步骤210:判断集合n的所有元素作为输入是否都过滤完毕,如果否,则返回步骤202;如果是,则执行步骤211。步骤211:以集合n的唯一标识为文件名记录一个properties文件,其中键为元素名,值为集合n的标识。最终,所述properties文件中记载的就是某个元素都在哪些集合中出现的信息。需要注意的是:所述Bloom过滤器之所以持久化到磁盘,能进行多次利用并提高效率,是建立在集合元素本身每次排重时变化均不剧烈的基础上的,如果变化剧烈则需要每次重建Bloom过滤器。但即使在变化不剧烈的情况下,也建议过一段时间,重建一次,以达到最佳过滤效果。以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1