嵌入式***中档案操作与快速检索方法
技术领域
本发明涉及一种嵌入式***中的档案操作与检索方法。
背景技术
嵌入式***是以应用为中心,以计算机技术为基础,软硬件可裁剪,功能、可靠性、成本、体积、功耗要求相对严格的专用计算机***。嵌入式***特点是:***内核小,专用性强,***精简,***与应用软件同步升级,***中的软件一般都固化在存储器芯片中。
目前,随着物联网的迅猛发展,嵌入式***在物联网身份识别领域的应用愈来愈广泛。在嵌入式身份识别应用中,内存空间小,CPU主频低,没有数据库引擎等条件限制,造成大数据量的档案检索,成了程序员头疼的问题。档案检索通常方法是:将档案整体加载到内存,在内存中顺序查找关键字,找到后返回该行的档案。在CPU主频400MHz,内存128M的嵌入式***和同等级的***中,做10万条档案通常检索方法测试,最长检索时间是2秒。检索速度超过1秒用户是不能接受的,因此,多数厂家给出档案最大容量是5万条。
发明内容
本发明所要解决的技术问题是,提供一种嵌入式***中档案操作与快速检索方法,在快速遍历算法基础上,完成档案加载,快速检索、增加、删除、过滤等操作;同时,尽量降低
内存消耗,提高***运行效率。
本发明的技术方案如下:
一种嵌入式***中档案操作与快速检索方法,其特征在于按照以下步骤进行加载与检索:
(1) 、将档案文件的行信息按序加载到内存中,形成“行索引”,用于建立列索引和文件的对应关系,便于档案内容的快速定位;
(2) 、将档案中的查询列按关键字排序后加载到内存中,形成“列索引”,为了减少内存占用,只加载查询列;
(3) 、包括关键字检索、档案加载、增加档案、删除档案、设置过滤条件以及取某行档案数据在内的档案操作:首先在列索引中查找关键字,找到所在行号后,在文件中定位相应的行,然后操作档案数据。其中关键字检索采用二分查找算法检索关键字,增加档案和删除档案在检索的基础上做文件操作,条件过滤在检索的基础上读取数据。
关键字检索方法是:在列索引中采用二分法查找关键字,找到后取档案行号,在行索引中二分查找行号,找到后取行位置和长度,在文件中找到位置后,按照有效数据长度取出数据。
所述档案加载方法是:从档案文件中逐行读出档案数据,将行号、起始位置和长度依次存储在行索引内存块中;将行数据分割得出关键列值,将其与行号一起形成列索引信息,顺序存储在列索引内存块中;文件读取完毕后,将列索引信息按照关键字先后顺序排序,生成档案的列索引。
所述增加档案方法是:将要增加的档案信息写入档案文件,获得档案的行号、起始位置、长度和关键字,生成行索引,检索关键字找到列索引***位置,将关键字和行号***列索引内存块中。
删除档案的方法是:在列索引块中找到删除档案的关键字的行号,删除列索引块中的关键字索引信息,检索行索引位置,删除档案内容和行索引块中的行索引信息。
所述设置过滤条件的方法是:在档案的列索引块中查找满足条件的索引集合的首尾索引号,将这两个值保存到档案信息结构中,标识下次执行按行取档案数据的起始和终止索引号。
所述取某行档案数据的方法是:如果没有设置过滤条件,自第0行开始,从行索引块中查找相应的行索引信息,然后从文件中取出该行档案数据;如果设置了过滤条件,从起始索引号位置起,顺序查找某行的索引值,在行索引块中找到该行的行索引信息,然后从文件中取出该行档案数据。
二分查找,又称为折半查找,当数据量很大时适宜采用该方法。二分查找只适用于有序表,且限于顺序存储结构 。假设有序表是递增排列的,首先确定区间的中间位置,待查值与中间位置的数值比较,如果相等,则查找成功并返回该位置。否则需重新确定查找区间,继续二分查找。重新确定查找区间的办法如下:如果中间位置的值大于待查值,则新区间为当前中间值的前半部分;如果中间位置的值小于待查值,则新区建为当前中间值的后半部分。这样,每次经过中间值与待查值的比较,就可以确定是否查找成功,不成功则查找区间减半,直至找到关键字或者当前区间为空为止。标准二分法适用于查找单个元素。
在标准二分法查找的基础上,扩展后可以实现数据块查找。如图2所示,某块数据中有多个数据与所要查找的数据相等,在排好序的基础上,利用标准二分法,查找成功后,继续遍历数据,直到查找到所需元素在数据块中最顶端的位置,然后将找到的最顶端位置作为新的搜索区域的起始位置,按照上述步骤,查找到所需元素在数据块中最底端的位置。这样便可实现数据块的定位。按照类似的方法,单独查找数据块最顶端位置和最底端位置,可以查
找任意满足某一区间(==、>、≥、<、≤)的数据块的定位。
本发明的积极效果在于:
顺序检索和快速检索的时间和空间复杂度对比。
(1) 、顺序检索方法时间复杂度和空间复杂度:
时间复杂度:T(n)=O(n);
空间复杂度:S(n)=O(n)。
(2)、本发明快速检索方法时间复杂度和空间复杂度:
时间复杂度:T(n)=O(log2n);
空间复杂度:S(n)=O(n)。
显而易见,在档案数相同情况下,相对于顺序检索方法,本发明快速检索方法时间复杂度优势明显,极大提高了检索效率;同时,快速检索方法只加载索引内容,降低了内存损耗。
经过测试,在CPU主频400MHz,内存128M的嵌入式***和同等级的***中,做20
万条档案两种检索方法对比测试,快速检索比顺序检索效率提高150倍左右。
档案检索功能虽然简单,但在身份识别领域中是一个重要环节,它的工作效率直接影响整个***的性能。本发明档案快速检索方案,在处理速度和内存使用上,充分考虑到了嵌入式***的特点,在性能上模糊了嵌入式***的局限性,成功解决了顺序检索方案速度慢,耗用内存大的问题。本发明档案快速检索的实现,对于身份识别领域应用开发具有深远的现实意义,给于嵌入式***应用开发以深刻启迪。
附图说明
图1是本发明关键字检索示意图。
图2是本发明本发明所采用的二分法扩展示意图。
具体实施方式
下面结合附图和具体实施方式进一步说明本发明。
本发明方案制定考虑了以下几点。首先,档案检索不能每次在文件中查找,因为每次在文件中查找速度会很慢,要在内存中查找;其次,应用占用内存不能太大,要预留一些空间给其他程序使用;最后,大数据量的档案(10万条以上)检索时间在1秒之内完成。
本发明的方法如下:
(1) 、将档案文件的行信息按序加载到内存中,形成“行索引”,用于建立列索引和文件的对应关系,便于档案内容的快速定位;
(2) 、将档案中的查询列按关键字排序后加载到内存中,形成“列索引”;为了减少内存占用,只加载查询列,而不是加载档案的全部内容;
(3) 、档案检索、档案加载、增加档案、删除档案、条件过滤以及取某行档案数据操作:首先在列索引中查找关键字,找到所在行号后,在文件中定位相应的行,然后操作档案数据;其中档案检索采用二分查找算法检索关键字,增加档案和删除档案在检索的基础上做文件操作,条件过滤在检索的基础上读取数据。
本发明检索过程如下:
档案快速检索的实现:检索关键字keyword,在列索引中采用二分法查找关键字,找到后取档案行号,在行索引中二分查找行号,找到后取行位置和长度,在文件中找到位置后,按照有效数据长度取出数据。
结合图1,检索方法举例如下。
文件信息:FileInfo(Filepath, max_rowid, query_index, query_begin_row, query_end_row,RowIndexBlock, ColumnIndexBlock …)。
其中:Filepath-文件路径, max_rowid-最大行号, query_index-检索列, query_begin_row-查询到起始行,query_end_row-查找到终止行,RowIndexBlock-行索引空间, ColumnIndexBlock-列索引空间。
列索引结构:ColumnIndexUnit(Keyword, RowID)。
其中:Keyword-关键字, RowID-行号。
行索引结构:RowIndexUnit(RowID, Position, Length)。
其中:RowID-行号, Position-行起始位置, Length-行长度。
档案操作除了关键字检索还有档案加载、增加档案、删除档案、设置过滤条件以及取某行档案数据等功能,下面逐一介绍各功能的实现方法。
(1) 、档案加载:从档案文件中逐行读出档案数据,将行号、起始位置和长度依次存储在行索引内存块中;将行数据分割得出关键列值,将其与行号一起形成列索引信息,顺序存储在列索引内存块中;文件读取完毕后,将列索引信息按照关键字先后顺序排序,生成档案的列索引。
(2) 、增加档案:将要增加的档案信息写入档案文件,获得档案的行号、起始位置、长度和关键字,生成行索引,检索关键字找到列索引***位置,将关键字和行号***列索引内存块中。
(3) 、删除档案:在列索引块中找到删除档案的关键字的行号,删除列索引块中的关键字索引信息,检索行索引位置,删除档案内容和行索引块中的行索引信息。
(4) 、设置过滤条件:在档案的列索引块中查找满足条件[索引列(==、>、≥、<、≤)关键字]的索引集合的首尾索引号,将这两个值保存到档案信息结构中,标识下次执行按行取档案数据的起始和终止索引号。
(5)、 取某行档案数据:在没有设置过滤条件的情况下,从第0行开始,从行索引块中查找相应的行索引信息,然后从文件中取出该行档案数据;如果设置了过滤条件,从起始索引号位置起,顺序查找某行的索引值,在行索引块中找到该行的行索引信息,然后从文件中取出该行档案数据。多行数据读取方法与此方法相同。