具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可以单个的形式存在,也可以多个的形式存在,本发明并不对此进行限定。本发明中的步骤虽然用标号进行了排列,但并不用于限定步骤的先后次序,除非明确说明了步骤的次序或者某步骤的执行需要其他步骤作为基础,否则步骤的相对次序是可以调整的。可以理解,本文中所使用的术语“和/或”涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能的组合。
如图1所示,在一个实施例中,一种数据文件的索引查找方法,包括如下步骤:
步骤S110,获取进行数据文件查找的关键词。
本实施例中,进行数据文件查找的关键词将是根据当前的数据查找需求而确定的,在这一查找过程中,数据文件即为存储于后台的大批量数据的统称,用户通过一定的关键词对存储于后台的大批量数据进行查找,以得到所需要的数据。
步骤S130,读取索引文件,在索引文件中通过布隆过滤器定位关键词所在的逻辑块。
本实施例中,后台将存储索引文件和数据文件,索引文件将为数据文件的快速查找提供索引。具体的,将通过布隆过滤器判断索引文件中是否存在与关键词相符的逻辑块,若为是,则说明与该逻辑块相关联的数据即为包含了关键词的数据,可作为查询结果输出。
其中,布隆过滤器为Bloomfilter,通过布隆过滤器实现索引文件中逻辑块的遍历,以定位所有与关键词相符的逻辑块。
步骤S150,查找得到与定位的逻辑块相关联的数据,并输出查找得到的数据。
本实施例中,每一逻辑块都将与一定的数据相关联,以便于通过索引文件中的逻辑块得到存储于硬盘中的数据。
通过如上所述的方法,将使得根据关键词所进行的数据查找过程中不需要逐一对后台存储的大批量数据进行逐一查找,只需要在索引文件中进行逻辑块的定位即可,实现了数据的快速查找,并且对于索引文件和数据文件的写入而言,仍然得以保持其顺序写入的特性,进而保证了索引文件和数据文件的快速写入,同时兼顾了优异的写入性能和查找性能。
如图2所示,在一个实施例中,上述步骤S130的具体过程为:
步骤S131,读取索引文件,以得到索引文件中包含的若干个逻辑块。
本实施例中,读取存储的索引文件,将通过索引文件中包含的若干个逻辑块为存储的数据提供索引,索引文件中的每一逻辑块均有与之相关联的数据。
步骤S133,通过哈希函数对关键词进行计算以得到相应的映射位置。
本实施例中,预先设置了若干个不同的哈希函数,以分别对关键词进行哈希计算得到一组映射位置,即每一哈希函数均对关键词进行哈希计算得到一映射位置,该映射位置将为数据的查找提供路径。
预先设置的哈希函数个数将与所允许的最大错误率有关,在优选的实施例中,若需要将错误率维持在千分之一以内,则需要设置10个哈希函数。
具体的,在通过哈希函数定位关键词所在的逻辑块必然存在着一定的错误率,即f=(1-p)k,其中,k为哈希函数个数,p=e-kn/m,kn<m,m为位表中的位数。
使位表中的一半为空,即元素值为零将有利于保持错误率最低,也就是说,当p为1/2,即k=in2*(m/n)将为最优结果。
步骤S135,判断映射位置是否与逻辑块中的位表相符,若为是,则进入步骤S137,若为否,则结束。
本实施例中,索引文件中每一逻辑块均存储了位表,逻辑块中的位表将包括了若干个元素值。具体的,在实际运营中该元素值将为1或0,逐一判断逻辑块的位表中与计算得到的映射位置所对应的元素值是否为1,进而在判断到所计算得到的一组映射位置所对应的元素值均为1时,则说明所计算得到的一组映射位置是与当前这一逻辑块中的位表相符的,因此可确定当前这一逻辑块即为关键词所在的逻辑块。
若判断到逻辑块的位表中任一计算得到的映射位置所对应的元素值为0,则说明所计算得到的一组映射位置与当前这一逻辑块中的位表并不相符,因此,当前这一逻辑块并不是关键词所在的逻辑块,需要对下一逻辑块进行遍历。
步骤S137,定位位表所在的逻辑块。
如图3所示,在另一个实施例中,上述步骤S110之前还将进行索引文件和数据文件的写入,因此该方法还包括如下步骤:
步骤S210,获取待写入的数据文件,并对数据文件进行逻辑分块以得到若干块数据。
本实施例中,待写入的数据文件可以是业务***运行过程中所产生的日志数据等,对数据文件进行逻辑分块以得到若干块数据以及每一块数据的起始偏移和结束偏移。
步骤S230,获取数据的关键词,通过哈希函数对关键词进行计算以得到相应的映射位置。
本实施例中,对每一块数据,都将获取数据的关键词,通过预先设置的一组哈希函数分别对关键词进行计算以得到一组映射位置。
步骤S250,调整逻辑块的位表中映射位置对应的元素值,将该数据与逻辑块关联存储,并将数据的相关信息写入逻辑块中,逻辑块为数据文件当前写入数据所对应的逻辑块。
本实施例中,在当前的逻辑块中将计算得到的一组映射位置所对应的若干个元素值进行数值调整,具体的,将与计算得到的一组映射位置所对应的若干个元素值调整为1,并将这一关键词所对应的数据与当前的逻辑块关联存储,此外,还将数据的相关信息写入逻辑块中以方便后续查找。
其中,数据的相关信息将包括了进行逻辑分块时在数据文件中的起始偏移和结束偏移、开始写入时间和结束写入时间。
通过如上所述的方式将使得索引文件和数据文件仍然是顺序写入的,同时也为数据的快速查找建立了索引,既不需要牺牲高写入速度又提升了查找速度。
进一步的,在索引文件的逻辑块中写入的数据的相关信息将包括开始写入时间和结束写入时间,由于数据文件和索引文件是同时写入的,因此,逻辑块中记录的开始写入时间和结束写入时间也是数据文件中某一块数据的开始写入时间和结束写入时间,因此,在进行查找的过程中,若指定了查找某一时间段的数据则可根据逻辑块中的记录进行快速查找,以快速地过滤掉那些并未处于这一时间段的数据,极大地缩小了查找范围,进一步地提高了查找速度和效率。
如图4所示,待写入的数据文件被进行逻辑分块得到了N块数据,其中,每一块数据均有其所对应的关键词。
对于每一块数据,都将通过一组哈希函数,即哈希函数1至哈希函数10对关键词进行计算以得到一组相应的映射位置,进而对逻辑块所对应的位表中与映射位置相对应的元素值置为1,将当前的这一块数据与逻辑块关联存储,并将相关信息写入逻辑块中,待即将新起一逻辑块,即当前的逻辑块满时将位表写入当前的逻辑块中。
通过如上所述的过程实现索引文件和数据文件的写入,以同时兼顾了高写入速度和快速的查找性能。
在另一个实施例中,上述步骤S250之后,该方法还包括:
判断逻辑块是否更换为新的逻辑块,若为是,则将位表写入该逻辑块中,并将数据文件当前写入数据所对应的逻辑块设置为新的逻辑块,若为否,则继续进行索引文件和数据文件的写入。
本实施例中,在判断到当前的逻辑块即将被写满时,将需要新起一个逻辑块进行索引文件的写入,此时,将当前的逻辑块所对应的位表写入至当前的逻辑块,以结束当前的逻辑块的写入,将数据文件当前写入数据所对应的逻辑块设置为新起的逻辑块。
在另一个实施例中,上述步骤S250之后,该方法还包括:根据逻辑块中位表的使用率和逻辑块的使用率对位表的大小进行调整的步骤。
本实施例中,逻辑块所对应的位表还将根据运营过程中的实际状况进行动态调整,以适应当前所进行的索引文件和数据文件写入。
具体的,位表所进行的动态调整将包括:
(1)与逻辑块的使用率相比,位表的使用率优先达到预设值时,将根据当前逻辑块的大小和预设固定值对位表进行放大以得到下一逻辑块所对应的位表大小。
若位表的使用率优先达到预设值而逻辑块的使用率并未达到预设值,则说明位表过小,可按照当前逻辑块的大小和预设固定值之间的比例进行放大,例如,该预设固定值可以是32MB。
(2)与位表的使用率相比,逻辑块的使用率优先达到预设值时,将下一逻辑块所对应的位表大小按照当前位表的使用率和预设值之间的比例调小。
其中,与逻辑块的使用率相比较的预设值和与位表的使用率相比较的预设值可以是相同的数值,例如,可均为50%,也可以根据实际需要设置不同的数值,在此不一一进行限定。
如上所述的数据文件的索引查找过程可应用于各种业务***的数据存储,即面对海量数据的写入和查找也均能得到非常高的写入速度和查找速度。
例如,该海量数据可为即时通信工具的登录日志数据,其中,每一条登录日志数据都包括了即时通信工具标识、登录时间以及登录的IP地址,以用于记录一个即时通信工具标识在什么时间,哪个IP地址上进行了登录操作,因此,通过如上所述的数据文件的索引查找过程实现登录日志数据的快速写入和快速查找。
也就是说,在传统的海量数据查找过程中常常需要遍历一天的数据,对每一条登录日志数据进行查找方可得到查找结果;而通过如上所述的数据文件的索引查找过程只需要先通过布隆过滤器对逻辑块进行定位即可排除大部分不可能的数据,进而在剩下的小部分数据中进行精确查找即可得到所需要的登录日志数据。
如图5所示,在一个实施例中,一种数据文件的索引查找***,包括关键词获取模块110、逻辑块定位模块130和查找模块150。
关键词获取模块110,用于获取进行数据文件查找的关键词。
本实施例中,进行数据文件查找的关键词将是根据当前的数据查找需求而确定的,在这一查找过程中,数据文件即为存储于后台的大批量数据的统称,用户通过一定的关键词对存储于后台的大批量数据进行查找,以得到所需要的数据。
逻辑块定位模块130,用于读取索引文件,在索引文件中通过布隆过滤器定位关键词所在的逻辑块。
本实施例中,后台将存储索引文件和数据文件,索引文件将为数据文件的快速查找提供索引。具体的,逻辑块定位模块130将通过布隆过滤器判断索引文件中是否存在与关键词相符的逻辑块,若为是,则说明与该逻辑块相关联的数据即为包含了关键词的数据,可作为查询结果输出。
其中,布隆过滤器为Bloomfilter,逻辑块定位模块130通过布隆过滤器实现索引文件中逻辑块的遍历,以定位所有与关键词相符的逻辑块。
查找模块150,用于查找得到与定位的逻辑块相关联的数据,并输出查找得到的数据。
本实施例中,每一逻辑块都将与一定的数据相关联,以便于通过索引文件中的逻辑块得到存储于硬盘中的数据。
通过如上所述的***,将使得根据关键词所进行的数据查找过程中不需要逐一对后台存储的大批量数据进行逐一查找,只需要在索引文件中进行逻辑块的定位即可,实现了数据的快速查找,并且对于索引文件和数据文件的写入而言,仍然得以保持其顺序写入的特性,进而保证了索引文件和数据文件的快速写入,同时兼顾了优异的写入性能和查找性能。
如图6所示,在一个实施例中,上述逻辑定位模块130包括读取单元131、位置映射单元133和位表判断单元135。
读取单元131,用于读取索引文件,以得到索引文件中包含的若干个逻辑块。
本实施例中,读取单元131读取存储的索引文件,将通过索引文件中包含的若干个逻辑块为存储的数据提供索引,索引文件中的每一逻辑块均有与之相关联的数据。
位置映射单元133,用于通过哈希函数对关键词进行计算以得到相应的映射位置。
本实施例中,预先设置了若干个不同的哈希函数,以分别对关键词进行哈希计算得到一组映射位置,即每一哈希函数均对关键词进行哈希计算得到一映射位置,该映射位置将为数据的查找提供路径。
预先设置的哈希函数个数将与所允许的最大错误率有关,在优选的实施例中,若需要将错误率维持在千分之一以内,则需要设置10个哈希函数。
具体的,在通过哈希函数定位关键词所在的逻辑块必然存在着一定的错误率,即f=(1-p)k,其中,k为哈希函数个数,p=e-kn/m,kn<m,m为位表中的位数。
使位表中的一半为空,即元素值为零将有利于保持错误率最低,也就是说,当p为1/2,即k=in2*(m/n)将为最优结果。
位表判断单元135,用于判断映射位置是否与逻辑块中的位表相符,若为是,则定位位表所在的逻辑块,若为否,则停止执行。
本实施例中,索引文件中每一逻辑块均存储了位表,逻辑块中的位表将包括了若干个元素值。具体的,在实际运营中该元素值将为1或0,位表判断单元135逐一判断逻辑块的位表中与计算得到的映射位置所对应的元素值是否为1,进而在判断到所计算得到的一组映射位置所对应的元素值均为1时,则说明所计算得到的一组映射位置是与当前这一逻辑块中的位表相符的,因此可确定当前这一逻辑块即为关键词所在的逻辑块。
若位表判断单元135判断到逻辑块的位表中任一计算得到的映射位置所对应的元素值为0,则说明所计算得到的一组映射位置与当前这一逻辑块中的位表并不相符,因此,当前这一逻辑块并不是关键词所在的逻辑块,需要对下一逻辑块进行遍历。
如图7所示,在另一个实施例中,该***还包括逻辑分块模块210、位置运算模块230和写入模块250。
逻辑分块模块210,用于获取待写入的数据文件,并对数据文件进行逻辑分块以得到若干块数据。
本实施例中,待写入的数据文件可以是业务***运行过程中所产生的日志数据等,逻辑分块模块210对数据文件进行逻辑分块以得到若干块数据以及每一块数据的起始偏移和结束偏移。
位置运算模块230,用于获取数据的关键司,通过哈希函数对关键词进行计算以得到相应的映射位置。
本实施例中,对每一块数据,位置运算模块230都将获取数据的关键词,通过预先设置的一组哈希函数分别对关键词进行计算以得到一组映射位置。
写入模块250,用于调整逻辑块的位表中映射位置对应的元素值,将数据与逻辑块关联存储,并将数据的相关信息写入逻辑块中,该逻辑块为数据文件当前写入数据所对应的逻辑块。
本实施例中,在当前的逻辑块中写入模块250将计算得到的一组映射位置所对应的若干个元素值进行数值调整,具体的,将与计算得到的一组映射位置所对应的若干个元素值调整为1,并将这一关键词所对应的数据与当前的逻辑块关联存储,此外,还将数据的相关信息写入逻辑块中以方便后续查找。
其中,数据的相关信息将包括了进行逻辑分块时在数据文件中的起始偏移和结束偏移、开始写入时间和结束写入时间。
通过如上所述的方式将使得索引文件和数据文件仍然是顺序写入的,同时也为数据的快速查找建立了索引,既不需要牺牲高写入速度又提升了查找速度。
进一步的,在索引文件的逻辑块中写入的数据的相关信息将包括开始写入时间和结束写入时间,由于数据文件和索引文件是同时写入的,因此,逻辑块中记录的开始写入时间和结束写入时间也是数据文件中某一块数据的开始写入时间和结束写入时间,因此,在进行查找的过程中,若指定了查找某一时间段的数据则可根据逻辑块中的记录进行快速查找,以快速地过滤掉那些并未处于这一时间段的数据,极大地缩小了查找范围,进一步地提高了查找速度和效率。
在另一个实施例中,如上所述的***还包括了逻辑块判断模块。
逻辑块判断模块用于判断逻辑块是否更换为新的逻辑块,若为是,则将位表写入逻辑块中,并将数据文件当前写入数据所对应的逻辑块设置为新的逻辑块。
本实施例中,在判断到当前的逻辑块即将被写满时,逻辑块判断模块将需要新起一个逻辑块进行索引文件的写入,此时,将当前的逻辑块所对应的位表写入至当前的逻辑块,以结束当前的逻辑块的写入,将数据文件当前写入数据所对应的逻辑块设置为新起的逻辑块。
在另一个实施例中,如上所述的***还包括了位表调整模块。该位表调整模块用于根据逻辑块中位表的使用率和逻辑块的使用率对位表的大小进行调整。
本实施例中,位表调整模块对逻辑块所对应的位表还将根据运营过程中的实际状况进行动态调整,以适应当前所进行的索引文件和数据文件写入。
具体的,位表调整模块对位表所进行的动态调整将包括:
(1)与逻辑块的使用率相比,位表的使用率优先达到预设值时,位表调整模块将根据当前逻辑块的大小和预设固定值对位表进行放大以得到下一逻辑块所对应的位表大小。
若位表的使用率优先达到预设值而逻辑块的使用率并未达到预设值,则说明位表过小,位表调整模块可按照当前逻辑块的大小和预设固定值之间的比例进行放大,例如,该预设固定值可以是32MB。
(2)与位表的使用率相比,逻辑块的使用率优先达到预设值时,位表调整模块将下一逻辑块所对应的位表大小按照当前位表的使用率和预设值之间的比例调小。
其中,与逻辑块的使用率相比较的预设值和与位表的使用率相比较的预设值可以是相同的数值,例如,可均为50%,也可以根据实际需要设置不同的数值,在此不一一进行限定。
在一个实施例中,如图8所示,提供了一种可运行前述数据文件的索引查找方法的服务器结构示意图。该服务器500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以***处理器(central processing units,CPU)522(例如,一个或一个以上处理器)和存储器532,一个或一个以上存储应用程序542或数据544的存储介质530(例如一个或一个以上海量存储设备)。其中,存储器532和存储介质530可以是短暂存储或持久存储。存储在存储介质530的程序可以包括一个或一个以上模块(如图5中的键词获取模块110、逻辑块定位模块130和查找模块150),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器522可以设置为与存储介质530通信,在服务器500上执行存储介质530中的一系列指令操作。服务器500还可以包括一个或一个以上电源526,一个或一个以上有线或无线网络接口550,一个或一个以上输入输出接口558,和/或,一个或一个以上操作***541,例如WindowsServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。上述图1所示实施例中所述的由服务器所执行的步骤可以基于该图8所示的服务器结构。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。