发明内容
有鉴于此,本发明提供一种子串查找方法及装置,以提高子串查找的效率。
本发明提供了一种子串查找方法,根据目标文件中长度最大的行数据设定第一长度,还包括:
确定待查找的目标子串;
根据设定的所述第一长度,将所述目标文件分割成多个预备数据块;
根据行分隔符,调整所述多个预备数据块的大小,得到调整后的多个实际数据块;
在每一个实际数据块中查找所述目标子串。
优选地,
所述根据行分隔符调整所述多个预备数据块的大小包括:对于每相邻的两个预备数据块,确定分隔该两个预备数据块的分隔位置,在该分隔位置之前或之后的预设第二长度范围内查找所述行分隔符,如果查找到,则将该分隔位置调整为所述分隔符所在的位置,以对所述两个预备数据块的大小进行调整,得到调整后的两个实际数据块。
优选地,进一步包括:
利用第一线程执行所述获取每一个实际数据块,利用第二线程执行所述在每一个实际数据块中查找所述目标子串。
优选地,所述在每一个实际数据块中查找所述目标子串之后,进一步包括:
记录在所述目标文件的每一个实际数据块中查找到的所述目标子串的数量,以及所查找到的每一个所述目标子串在所述目标文件中的位置。
本发明还提供了一种子串查找装置,包括:
存储单元,用于根据目标文件中长度最大的行数据设定第一长度;
确定单元,用于确定待查找的目标子串;
分割单元,用于根据设定的所述第一长度,将所述目标文件分割成多个预备数据块;
调整单元,用于根据行分隔符,调整所述多个预备数据块的大小,得到调整后的多个实际数据块;
查找单元,用于在每一个实际数据块中查找所述目标子串。
优选地,所述调整单元,用于对于每相邻的两个预备数据块,确定分隔该两个预备数据块的分隔位置,在该分隔位置之前或之后的预设第二长度范围内查找所述行分隔符,如果查找到,则将该分隔位置调整为所述分隔符所在的位置,以对所述两个预备数据块的大小进行调整,得到调整后的两个实际数据块。
优选地,进一步包括:
获取单元,用于利用第一线程执行所述获取每一个实际数据块,利用第二线程执行所述在每一个实际数据块中查找所述目标子串。
优选地,进一步包括:
记录单元,用于记录在所述目标文件的每一个实际数据块中查找到的所述目标子串的数量,以及所查找到的每一个所述目标子串在所述目标文件中的位置。
本发明实施例提供了一种子串查找方法及装置,通过设定数据块的长度,在获取目标文件时,可以每次获取一个数据块,其中,由于在每次获取数据块时可以根据设定数据块的长度进行获取,该长度可以根据目标文件中长度最大的行数据来设定,从而提高了每次获取数据的长度,进而提高了子串查找效率。为了保证数据块在分割时,目标子串不分别位于相邻的两个数据块中,可以根据行分隔符,调整分割成的多个预备数据块的大小,得到了调整后的多个实际数据块,从而保证了目标文件分割后,目标子串不分别位于相邻的两个数据块中,提高了子串查找的准确性。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明实施例提供了一种子串查找方法,根据目标文件中长度最大的行数据设定第一长度,该方法可以包括以下步骤:
步骤101:确定待查找的目标子串。
步骤102:根据设定的所述第一长度,将所述目标文件分割成多个预备数据块。
步骤103:根据行分隔符,调整所述多个预备数据块的大小,得到调整后的多个实际数据块。
步骤104:在每一个实际数据块中查找所述目标子串。
根据上述方案,通过设定数据块的长度,在获取目标文件时,可以每次获取一个数据块,其中,由于在每次获取数据块时可以根据设定数据块的长度进行获取,该长度可以根据目标文件中长度最大的行数据来设定,从而提高了每次获取数据的长度,进而提高了子串查找效率。为了保证数据块在分割时,目标子串不分别位于相邻的两个数据块中,可以根据行分隔符,调整分割成的多个预备数据块的大小,得到了调整后的多个实际数据块,从而保证了目标文件分割后,目标子串不分别位于相邻的两个数据块中,提高了子串查找的准确性。
由于根据设定的第一长度将目标文件分割为多个预备数据块,可能导致待查找的目标子串分别位于两个相邻的预备数据块中,根据目标子串不可能被行分隔符分离的性质,可以对于每相邻的两个预备数据块,确定分隔该两个预备数据块的分隔位置,在该分隔位置之前或之后的预设第二长度范围内查找行分隔符,如果查找到,则将该分隔位置调整为分隔符所在的位置,以对两个预备数据块的大小进行调整,得到调整后的两个实际数据块。
为使本发明的目的、技术方案和优点更加清楚,下面结合附图及具体实施例对本发明作进一步地详细描述。
如图2所示,本发明实施例提供了一种子串查找方法,该方法可以包括以下步骤:
步骤201:根据目标文件n中长度最大的行数据设定一个长度l,其中,设定的该长度l用于将文件n分割为多个数据块。
在本实施例中,由于现有技术方案中对文件n进行逐行获取的效率较低,为了提高在文件n中查找子串的效率,可以每次获取一个数据块,其中,该长度l可以根据文件n中长度最大的行数据进行设定,且设定的长度l需不小于该长度最大的行数据。例如,文件n中长度最大的行数据的长度为5KB,那么获取的数据块的长度l需要不小于5KB。另外,该长度l还可以根据对文件中一行数据的长度的经验值来设定,比如,一个文件中一行数据的长度范围可以是2KB-6KB,那么长度l就可以设定为不小于6KB的值。当然,为了提高获取文件n的数据块的效率,可以将长度l设定为一个较高的值,比如,100MB。
步骤202:确定待查找的目标子串。
在本实施例中,子串是指任意一个或连续的多个字符,例如,“abd”、“你好”、“的”“我们”等等都可以称之为子串。例如,可以将“我们”作为本实施例中待查找的目标子串。
在本实施例中,可以指定数据库中的大量文件作为本实施例中用于查找子串的文件n,文件n的长度可以达到TB级。
步骤203:根据长度l,将文件n分割成多个预备数据块。
如图3所示,为文件分割示意图,假设文件n的长度为10GB,设定的长度l为100MB,那么需要对该文件分割为100份,即将文件n分割为预备数据块1、预备数据块2、预备数据块3、…预备数据块100。其中,预备数据块1在文件n中的位置为文件n的文件头,预备数据块2在文件n中的位置为第100MB,预备数据块3在文件n中的位置为第200MB……。其中,图3中是以分割后的预备数据块2为例,对文件n被分割成多个预备数据块进行说明。
步骤204:对于每相邻的两个预备数据块,确定分隔该两个预备数据块的分隔位置。
在本实施例中,相邻两个预备数据块之间的分割位置如图3所示的预备分割位置处,其中,预备数据块2与预备数据块1之间包括一个分割位置,预备数据块2与预备数据块3之间包括一个分割位置。
步骤205:在该分隔位置之前或之后的预设第二长度范围内查找行分隔符,如果查找到,执行步骤206,否则,执行步骤207。
由于根据长度l将文件n分割为多个预备数据块,可能导致子串“我们”分别位于两个相邻的预备数据块中,例如,对于分割成的预备数据块1和预备数据块2,在分割时“我”位于预备数据块1中,是预备数据块1的最后一个字符,“们”位于预备数据块2中,是预备数据块2的第一个字符,可能会导致在后续预备数据块1和预备数据块2中分别查找子串“我们”时,无法查找到该被分割开的子串“我们”,影响了子串查找的准确性。因此,在对文件n进行分割前需要对数据库的大小进行调整。
在本实施例中,根据子串不可能被行分隔符分离的性质,可以根据行分隔符来确定子串是否被两个预备数据块之间的分割位置所分离。
在本实施例中,第二长度范围可以根据子串的长度来设定,即,第二长度必须不小于子串的长度。比如,子串“我们”的长度为2KB,那么需要设定第二长度范围不小于2KB,例如,如图3所示的5KB。
在本发明一优选实施例中,可以在分割位置之前的5KB区域内查找行分隔符,也可以在分割位置之后的5KB区域内查找行分隔符。
步骤206:将该分隔位置调整为分隔符所在的位置,以对两个预备数据块的大小进行调整,得到调整后的两个实际数据块,执行步骤208。
由于子串不可能位于行分隔符之间,因此,如果在分割位置的第二长度范围的区域内查找到行分隔符,则将该分割位置调整为行分隔符所在的位置,从而得到了如图3所示的实际数据块2。
步骤207:不对分割位置进行调整,继续执行步骤208。
步骤208:在每一个实际数据块中查找目标子串。
在本实施例中,每一次与CPU交互,进行IO访问,可以从文件n的文件头到文件尾的顺序依次获取一个实际数据块。
由于现有技术方案是每获取一行数据均需要在获取的该行数据查找完成子串之后,才能继续获取下一行数据,因此,在本发明一优选实施例中,可以使用两类线程分别完成实际数据块的获取和查找。例如,使用两个线程,其中一个线程用于逐次获取一个实际数据块,另一个线程用于在获取的实际数据块查找子串,从而无需等待查找子串的过程即可去获取下一个的实际数据块,从而提高了子串查找效率。
如图4所示,为本实施例读数据块和写数据块的示意图。其中,通过访问IO Thread将数据块写入内存(Buffer 1和Buffer 2)中,CPU Thread用于从内存中读取数据块。
步骤209:记录文件n中查找到的子串的数量,以及所查找到的每一个子串在文件n中的位置。
由于现有技术方案中在查找到一个子串之后,即结束子串查找的过程,因此,本实施例可以在文件n中查找子串的过程中,记录所查找到的子串的数量以及每一个子串在文件n中的位置,从而方便了对每一个子串的查找。
如图5、图6所示,本发明实施例提供了一种子串查找装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。从硬件层面而言,如图5所示,为本发明实施例子串查找装置所在设备的一种硬件结构图,除了图5所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等。以软件实现为例,如图6所示,作为一个逻辑意义上的装置,是通过其所在设备的CPU将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。本实施例提供的子串查找装置60包括:
存储单元601,用于根据目标文件中长度最大的行数据设定第一长度;
确定单元602,用于确定待查找的目标子串;
分割单元603,用于根据设定的第一长度,将目标文件分割成多个预备数据块;
调整单元604,用于根据行分隔符,调整多个预备数据块的大小,得到调整后的多个实际数据块;
查找单元605,用于在每一个实际数据块中查找目标子串。
进一步地,调整单元604,用于对于每相邻的两个预备数据块,确定分隔该两个预备数据块的分隔位置,在该分隔位置之前或之后的预设第二长度范围内查找行分隔符,如果查找到,则将该分隔位置调整为分隔符所在的位置,以对两个预备数据块的大小进行调整,得到调整后的两个实际数据块。
在本发明一个优选实施例中,如图7所示,子串查找装置还可以进一步包括:
获取单元701,用于利用第一线程执行获取每一个实际数据块,利用第二线程执行在每一个实际数据块中查找目标子串。
进一步包括:
记录单元702,用于记录在目标文件的每一个实际数据块中查找到的目标子串的数量,以及所查找到的每一个目标子串在目标文件中的位置。
如上,本发明实施例至少可以实现如下有益效果:
1、通过设定数据块的长度,在获取目标文件时,可以每次获取一个数据块,其中,由于在每次获取数据块时可以根据设定数据块的长度进行获取,该长度可以设定为大于目标文件中长度最大的行数据的长度,从而提高了每次获取数据的长度,进而提高了子串查找效率。
2、为了保证数据块在分割时,目标子串不分别位于相邻的两个预备数据块中,可以对预备数据块的大小进行调整,从而得到实际数据块,从而保证了分割数据块时目标子串不分别位于相邻的两个数据块中,从而提高了子串查找的准确性。
3、通过使用两类线程实现对数据块获取与子串查找的分离,无需等待线程进行子串查找结束即可继续获取下一个数据块,从而提高了子串查找的效率。
4、在对文件查找子串完全结束后,可以记录文件中所包括子串的数量以及每一个子串在文件中的起始位置,从而使得用户方便的对各个子串进行查看。
上述设备内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个······”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同因素。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储在计算机可读取的存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质中。
最后需要说明的是:以上仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。