本发明涉及存储器领域,尤其涉及一种数据记录的存储、查询和检索的方法及装置。
背景技术:
Nand Flash在设计之初是为了数据存储应用,其芯片面积小,容量大。传统方式下,在Nand Flash中进行数据记录的存储、检索与查询时,需遍历所有的数据记录进行比较、定位,尤其是存储区内已经存有多条数据且每条存储的数据很长时,对数据记录的存储、检索与查询的效率会非常低。
技术实现要素:
本发明的目的是为了克服现有技术的缺陷,提出适用于Nand Flash等存储介质的一种数据记录的存储、查询和检索的方法及装置。
本发明采用的技术方案是:
一种数据记录的存储方法,方法具体包括:
步骤S1:提取待存储的数据记录的关键字段;
步骤S2:计算所述关键字段的特征值;
步骤S3:判断索引区中是否包含存储有所述特征值的索引单元,是则执行步骤S4,否则执行步骤S5;
步骤S4:确定与存储有所述特征值的索引单元对应的数据单元,读取数据记录,并判断读取到的数据记录和所述待存储的数据记录是否相同,是则所述待存储的数据记录已存储,结束,否则执行步骤S5;
步骤S5:将所述特征值存入索引区,将所述待存储的数据记录存入数据区。
一种数据记录的查询方法,方法具体包括:
步骤T1:提取待查询的数据记录的关键字段;
步骤T2:计算所述关键字段的特征值;
步骤T3:判断索引区中是否包含存储有所述特征值的索引单元,是则执行步骤T4,否则未查询到相应数据记录,结束;
步骤T4:确定与存储有所述特征值的索引单元对应的数据单元,读取数据记录,并判断读取到的数据记录和所述待查询的数据记录是否相同,是则查询到相应数据记录,结束,否则未查询到相应数据记录,结束。
一种数据记录的检索方法,方法具体包括:
步骤U1:计算待检索数据记录的关键字段的特征值;
步骤U2:判断索引区中是否包含存储有所述特征值的索引单元,是则执行步骤U3,否则未检索到相应数据记录,结束;
步骤U3:确定与存储有所述特征值的索引单元对应的数据单元,读取并显示所述数据记录,结束。
一种数据记录的存储装置,装置具体包括:
提取模块,用于提取待存储的数据记录的关键字段;
计算模块,用于计算待存储数据记录的关键字段的特征值;
第一判断模块,用于判断索引区中是否包含存储有所述特征值的索引单元;
定位模块,用于当所述第一判断模块判断索引区中包含存储有所述特征值的索引单元时,确定与存储有所述特征值的索引单元对应的数据单元;
读取模块,用于读取数据记录;
第二判断模块,用于判断读取到的数据记录和待存储的数据记录是否相同;
第一写入模块,用于当所述第一判断模块判断出索引区中不包含所述计算模块计算得到的特征值时,将带存储数据记录的关键字段的特征值存入索引区;还用于当所述第二判断模块判断出读取到的数据记录和待存储的数据记录不相同时,将待存储数据记录的关键字段的特征值存入索引区;
第二写入模块,用于将所述待存储的数据记录存入数据区。
一种数据记录的查询装置,装置具体包括:
提取模块,用于提取待存储的数据记录的关键字段;
计算模块,用于计算待存储数据记录的关键字段的特征值;
第一判断模块,用于判断索引区中是否包含存储有所述特征值的索引单元;
定位模块,用于当所述第一判断模块判断索引区中包含存储有所述特征值的索引单元时,确定与存储有所述特征值的索引单元对应的数据单元;
读取模块,用于读取数据记录;
第二判断模块,用于判断读取到的数据记录和待存储的数据记录是否相同。
一种数据记录的检索装置,装置具体包括:
计算模块,用于计算待存储数据记录的关键字段的特征值;
判断模块,用于判断索引区中是否包含存储有所述特征值的索引单元;
定位模块,用于当所述判断模块判断索引区中包含存储有所述特征值的索引单元时,确定与存储有所述特征值的索引单元对应的数据单元;
读取模块,用于读取数据记录;
显示模块,用于显示读取的数据记录。
本发明取得的有益效果是:
采用本发明的技术方法,将Nand Flash的存储区域划分为索引区和数据区,提取数据记录的关键字段并存入索引区,将索引区的关键字段读入内存后遍历,直接确定了索引区中的关键字段对应的数据记录存放的数据区的位置,大大提升了数据记录的存储、查询和检索的效率。
附图说明
为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一中提供的一种数据记录的存储方法的流程图;
图2为本发明实施例二中提供的一种数据记录的存储方法的流程图;
图3为本发明中存储区域的一种结构示意图;
图4为本发明中待存储的数据记录成功存储后存储区域的一种示意图;
图5为本发明实施例三中提供的一种数据记录的查询方法的流程图;
图6为本发明实施例四中提供的一种数据记录的查询方法的流程图;
图7为本发明实施例五中提供的一种数据记录的检索方法的流程图;
图8为本发明实施例六中提供的一种数据记录的检索方法的流程图;
图9为本发明实施例七中提供的一种数据记录的存储装置的示意图;
图10为本发明实施例八中提供的一种数据记录的查询装置的示意图;
图11为本发明实施例九中提供的一种数据记录的检索装置的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例一提供了一种数据记录的存储方法,具体地,数据记录的存储区域划分为索引区和数据区,索引区包含若干个固定长度的索引单元,数据区包含若干个固定长度的数据单元,一个索引单元存有一条特征值,一个数据单元存有一条数据记录,每条数据记录的长度不超过一个数据单元的长度,索引单元和数据单元一一对应,索引区用于存储数据记录的关键字段的特征值,数据区用于存储数据记录,参见图1,方法具体包括:
步骤S1:提取待存储的数据记录的关键字段;
步骤S2:计算待存储的数据记录的关键字段的特征值;
步骤S3:判断索引区中是否包含存储有待存储的数据记录的关键字段的特征值的索引单元,是则执行步骤S4,否则执行步骤S5;
步骤S4:确定与存储有待存储的数据记录的关键字段的特征值的索引单元对应的数据单元,读取数据记录,并判断读取到的数据记录和待存储的数据记录是否相同,是则待存储的数据记录已存储,结束,否则执行步骤S5;
步骤S5:将待存储的数据记录的关键字段的特征值存入索引区,将待存储的数据记录存入数据区。
实施例二
本发明实施例二提供提供了一种数据记录的存储方法,具体地,存储区域包括索引区和数据区;其中,索引区可以常驻在内存中,包括若干索引单元,用于存储关键字段的特征值,数据区包括与各索引单元一一对应的数据单元,用于存储数据记录。参见图2,方法具体包括:
步骤101:提取待存储数据记录的关键字段;
具体地,提取数据记录的一个或多个关键字段。
例如,本实施例中,数据记录共33字节,包括8字节的商户号、4字节的终端号、5字节的收单行标识以及16字节的密钥,关键字段的特征值共4字节,以“商户号”为关键字段,提取数据记录中的“商户号”。
步骤102:计算待存储数据记录的关键字段的特征值;
本实施例中,使用预设算法计算待存储数据记录的关键字段的特征值。
具体地,预设算法为CRC32、CRC16、SHA1、MD5等算法,优选为CRC32算法。
例如,关键字段“商户号”为001370248129050,用CRC32算法计算出的特征值是379854B。
步骤103:判断索引区是否还有空间存储一条数据记录关键字段的特征值,是则执行步骤104,否则结束;
步骤104:将索引区的数据记录关键字段的特征值按页载入内存;
在本实施例中,由于Nand Flash是按页读写的,每一条索引单元,每一条数据记录的大小是确定的,所以存储区的一页所能存放的索引单元和数据记录也是确定的,索引单元和数据记录的大小不会超过存储区一页的大小。为避免出现跨页存储的情况,写入的索引单元和数据单元进行数据对齐,即将索引单元长度和数据单元长度设置为大于或等于实际索引单元长度和数据单元长度并为页面大小的某个约数。
具体地,在本实施例中,假设存储区域大小为FS,则存储区域能放N=FS/(索引单元长度+数据单元长度)条记录,得到的结果向下取整数。索引区大小为N*索引单元长度,数据区大小为N*数据单元长度,数据区的起始地址为索引区的起始地址+N*索引单元长度。数据区的起始地址可以用上述公式计算得到,也可以进行指定。
更具体地,N*索引单元长度/页内最多字节数将得到的结果向上取整数得到索引区是由多少包含索引单元的页组成,N*索引单元长度/页内最多字节数/块内最多页数将得到的结果向上取整数得到索引区是由多少块组成。相应地,按照上述方法,能知道数据区所占的页数和块数。
例如,如图3所示,在本实施例中一个Nand Flash块最多存放32个Nand Flash页面,一个Nand Flash页面最多能够存放512个字节,索引区起始位置为0,一条索引单元长度为4字节,一个页面可以存放128条索引单元,已存储在索引区第一个块第一个页面的第一条索引单元的特征值是A0DC6439;相对应的数据单元长度为33字节,把数据单元长度从33字节扩充到64字节,即按64字节对齐,这样一个页面可以存放8条记录数据,存入的数据记录为0013702481227082000020708010045204471244442611F74447104445A5CB444。其中,索引区第一个块即为Nand Flash存储区域的第一个块。
其中,按页载入内存,包括:
步骤A1:将索引区第一块作为当前块,将索引区第一块的第一页作为当前页面;
步骤A2:将当前页面的数据载入内存;
步骤A3:判断当前页面是否为索引区第一块的最后一页,是则执行步骤A4,否则执行步骤A5;
步骤A4:判断当前块是否为索引区的最后一块,是则结束,否则将索引区下一个块的第一页作为当前页面,返回步骤A2;
步骤A5:将当前页面的下一页面作为当前页面,返回步骤A2。
步骤105:判断载入内存的数据是否包含特征值,是则执行步骤106,否则执行步骤110;
具体地,在本实施例中,判断载入内存的数据是否包含特征值,包括:
步骤B1:初始化当前偏移地址;
步骤B2:根据当前偏移地址读取一个索引单元长度的数据,判断读取到的数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤B3;
步骤B3:更新偏移地址为当前偏移地址加上读取的数据的长度,判断更新的偏移地址是否超过载入内存的数据的长度,是则载入内存的数据不包含特征值,否则返回步骤B2。
此外,在本实施例中,判断载入内存的数据是否包含特征值,还包括:
步骤C1:初始化遍历游标;
步骤C2:从内存中顺序读取长度等于索引单元的长度的数据,将读取到的数据作为当前内存数据;
步骤C3:判断当前内存数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤C4;
步骤C4:将遍历游标增加第一预设值,判断遍历游标是否超过第二预设值,是则载入内存的数据不包含特征值,否则返回步骤C2。
例如,读取的特征值为379854B,与待存储数据记录的关键字段的特征值A0DC6439不同,直接执行步骤110。
步骤106:确定待存储数据记录的关键字段的特征值对应的索引区的索引单元;
具体地,在本实施例中,可以根据偏移地址的值确定特征值对应的索引区的索引单元,也可以根据遍历游标确定特征值对应的索引区的索引单元。
步骤107:根据与待检索数据记录相同的关键字段的特征值所在的索引单元在数据区中定位到对应的数据单元所在的块号和页号;
具体地,在本实施例中,第n(n<=N)条索引单元的位置为n*索引单元长度,此条索引单元对应的数据单元的位置为N*索引单元长度+n*数据单元长度。
更具体地,(N*索引单元长度+n*数据单元长度)/页内最多字节数/块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的块号;(N*索引单元长度+n*数据单元长度)/页内最多字节数%块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的页号。
例如,在本实施例中,最多存储8192条数据记录的关键字段的特征值,即索引区占据了Nand Flash存储区域的两个块。根据上述公式算得,第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页。
步骤108:将定位的数据单元所在页的所有数据载入至内存,根据页内偏移地址查找并读取与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录;
具体地,(N*索引单元长度+n*数据单元长度)%页内最多字节数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在页的页内偏移地址。
例如,在本实施例中,将第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页的所有数据即数据区第一个块的第一页的所有数据载入至内存,根据上述公式,算得页内偏移地址为33,即前33个字节为与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录,载入出来的数据为0013702481227082000020708010045204471244442611F74447104445A5CB444。
步骤109:判断读取到的数据记录和待存储的数据记录是否相同,是则结束,否则执行步骤110;
步骤110:确定将待存储数据记录的关键字段的特征值写入索引区中的位置;
具体地,本实施例中,如果当前索引区的最后一条数据记录关键字段的特征值是此页的最后一条数据记录关键字段的特征值,则将同一个块的下一页的数据载入至内存;如果当前索引区的最后一条数据记录关键字段的特征值是块的最后一页的最后一条数据记录关键字段的特征值,则将下一个块的第一页的数据载入至内存。
步骤111:将待存储数据记录的关键字段的特征值顺序写入索引区;
具体地,本实施例中,先将待存储数据记录的关键字段的特征值顺序写入内存,然后再将内存中的数据写入索引区。
例如,本实施例中,如图4所示,将待存储数据记录的关键字段的特征值379854B顺序写入索引区第一块的第一页的第5至8字节。
步骤112:确定将待存储的数据记录写入数据区中的位置;
具体地,本实施例中,如果当前索引区的最后一条数据记录是此页的最后一条数据记录,则将同一个块的下一页的数据载入至内存;如果当前数据区的最后一条数据记录是块的最后一页的最后一条数据记录,则将下一个块的第一页的数据载入至内存。
步骤113:将待存储的数据记录顺序写入数据区,结束。
具体地,本实施例中,先将待存储的数据记录顺序写入内存,然后再将内存中的数据写入数据区。
例如,本实施例中,如图4所示,特征值379854B对应的数据记录00137024812905090501001080100452083D2B9CB1F2819E30000000200000000存储在存储区域的第三个块的第一页的第34字节至66字节,结束存储。
实施例三
本发明实施例三提供一种数据记录的查询方法,具体地,数据记录的存储区域划分为索引区和数据区,索引区包含若干个固定长度的索引单元,数据区包含若干个固定长度的数据单元,一个索引单元存有一条特征值,一个数据单元存有一条数据记录,每条数据记录的长度不超过一个数据单元的长度,索引单元和数据单元一一对应,索引区用于存储数据记录的关键字段的特征值,数据区用于存储数据记录,参见图5,方法具体包括:
步骤T1:提取待查询的数据记录的关键字段;
步骤T2:计算待查询的数据记录的关键字段的特征值;
步骤T3:判断索引区中是否包含存储有待查询的数据记录的关键字段的特征值的索引单元,是则执行步骤T4,否则未查询到相应数据记录,结束;
步骤T4:确定与存储有待查询的数据记录的关键字段的特征值的索引单元对应的数据单元,读取数据记录,并判断读取到的数据记录和待查询的数据记录是否相同,是则查询到相应数据记录,结束,否则未查询到相应数据记录,结束。
实施例四
本发明实施例四提供一种数据记录的查询方法,具体地,存储区域包括索引区和数据区;其中,索引区索引区可以常驻在内存中,包括若干索引单元,用于存储关键字段的特征值,数据区包括与各索引单元一一对应的数据单元,用于存储数据记录。参见图6,方法具体包括:
步骤201:提取待查询数据记录的关键字段;
具体地,提取数据记录的一个或多个关键字段。
例如,本实施例中,数据记录共33字节,包括8字节的商户号、4字节的终端号、5字节的收单行标识以及16字节的密钥,在本实施例中,以“商户号”为关键字段,提取数据记录中的“商户号”。
步骤202:计算待查询数据记录的关键字段的特征值;
本实施例中,使用预设算法计算待查询数据记录的关键字段的特征值。
具体地,预设算法为CRC32、CRC16、SHA1、MD5等算法,优选为CRC32算法。
例如,关键字段“商户号”具体为001370248122708,用CRC32算法计算出的特征值是A0DC6439。
步骤203:将索引区的数据记录关键字段的特征值按页载入内存;
在本实施例中,由于Nand Flash是按页读写的,每一条索引单元,每一条数据记录的大小是确定的,所以存储区的一页所能存放的索引单元和数据记录也是确定的,索引单元和数据记录的大小不会超过存储区一页的大小。为避免出现跨页存储的情况,写入的索引单元和数据单元进行数据对齐,即将索引单元长度和数据单元长度设置为大于或等于实际索引单元长度和数据单元长度并为页面大小的某个约数。
具体地,在本实施例中,假设存储区域大小为FS,则存储区域能放N=FS/(索引单元长度+数据单元长度)条记录,得到的结果向下取整数。索引区大小为N*索引单元长度,数据区大小为N*数据单元长度,数据区的起始地址为索引区的起始地址+N*索引单元长度。数据区的起始地址可以用上述公式计算得到,也可以进行指定。
更具体地,N*索引单元长度/页内最多字节数将得到的结果向上取整数得到索引区是由多少包含索引单元的页组成,N*索引单元长度/页内最多字节数/块内最多页数将得到的结果向上取整数得到索引区是由多少块组成。相应地,按照上述方法,能知道数据区所占的页数和块数。
例如,如图3所示,在本实施例中一个Nand Flash块最多存放32个Nand Flash页面,一个Nand Flash页面最多能够存放512个字节,索引区起始位置为0,一条索引单元长度为4字节,一个页面可以存放128条索引单元,已存储在索引区第一个块第一个页面的第一条索引单元的特征值是A0DC6439;相对应的数据单元长度为33字节,把数据单元长度从33字节扩充到64字节,即按64字节对齐,这样一个页面可以存放8条记录数据,存入的数据记录为0013702481227082000020708010045204471244442611F74447104445A5CB444。其中,索引区第一个块即为Nand Flash存储区域的第一个块。
其中,按页载入内存,包括:
步骤A1:将索引区第一块作为当前块,将索引区第一块的第一页作为当前页面;
步骤A2:将当前页面的数据载入内存;
步骤A3:判断当前页面是否为索引区第一块的最后一页,是则执行步骤A4,否则执行步骤A5;
步骤A4:判断当前块是否为索引区的最后一块,是则结束,否则将索引区下一个块的第一页作为当前页面,返回步骤A2;
步骤A5:将当前页面的下一页面作为当前页面,返回步骤A2。
步骤204:判断内存中是否存在与待查询数据记录的关键字段特征值相同的特征值,是则执行步骤205,否则结束;
具体地,在本实施例中,判断内存中是否存在与待查询数据记录的关键字段特征值相同的特征值,包括:
步骤B1:初始化当前偏移地址;
步骤B2:根据当前偏移地址读取一个索引单元长度的数据,判断读取到的数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤B3;
步骤B3:更新偏移地址为当前偏移地址加上读取的数据的长度,判断更新的偏移地址是否超过载入内存的数据的长度,是则载入内存的数据不包含特征值,否则返回步骤B2。
此外,在本实施例中,判断载入内存的数据是否包含特征值,还包括:
步骤C1:初始化遍历游标;
步骤C2:从内存中顺序读取长度等于索引单元的长度的数据,将读取到的数据作为当前内存数据;
步骤C3:判断当前内存数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤C4;
步骤C4:将遍历游标增加第一预设值,判断遍历游标是否超过第二预设值,是则载入内存的数据不包含特征值,否则返回步骤C2。
步骤205:确定待存储数据记录的关键字段的特征值对应的索引区的索引单元;
具体地,在本实施例中,可以根据偏移地址的值确定特征值对应的索引区的索引单元,也可以根据遍历游标确定特征值对应的索引区的索引单元。
步骤206:根据与待检索数据记录相同的关键字段的特征值所在的索引单元在数据区中定位到对应的数据单元所在的块号和页号;
具体地,在本实施例中,第n(n<=N)条索引单元的位置为n*索引单元长度,此条索引单元对应的数据单元的位置为N*索引单元长度+n*数据单元长度。
更具体地,(N*索引单元长度+n*数据单元长度)/页内最多字节数/块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的块号;(N*索引单元长度+n*数据单元长度)/页内最多字节数%块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的页号。
例如,在本实施例中,最多存储8192条数据记录的关键字段的特征值,即索引区占据了Nand Flash存储区域的两个块。根据上述公式算得,第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页。
步骤207:将定位的数据单元所在页的所有数据载入至内存,根据页内偏移地址查找并读取与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录。
具体地,(N*索引单元长度+n*数据单元长度)%页内最多字节数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在页的页内偏移地址。
例如,在本实施例中,将第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页的所有数据即数据区第一个块的第一页的所有数据载入至内存,根据上述公式,算得页内偏移地址为33,即前33个字节为与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录,载入出来的数据为
0013702481227082000020708010045204471244442611F74447104445A5CB444。
步骤208:判断读取到的数据记录和待查询的数据记录是否相同,是则确认存储区域中存在待查询数据记录,结束;否则确认存储区中不存在待查询数据记录,结束。
实施例五
本发明实施例五提供一种数据记录的检索方法,具体地,数据记录的存储区域划分为索引区和数据区,索引区包含若干个固定长度的索引单元,数据区包含若干个固定长度的数据单元,一个索引单元存有一条特征值,一个数据单元存有一条数据记录,每条数据记录的长度不超过一个数据单元的长度,索引单元和数据单元一一对应,索引区用于存储数据记录的关键字段的特征值,数据区用于存储数据记录,参见图7,方法具体包括:
步骤U1:计算待检索数据记录的关键字段的特征值;
步骤U2:判断索引区中是否包含存储待检索数据记录的关键字段的特征值的索引单元,是则执行步骤U3,否则未检索到相应数据记录,结束;
步骤U3:确定与存储有待检索数据记录的关键字段的特征值的索引单元对应的数据单元,读取并显示数据记录,结束。
实施例六
本发明实施例六提供一种数据记录的检索方法。Nand Flash是由若干块组成,每个块又由若干页组成,具体地,本实施例中,将Nand Flash的存储区域划分为索引区和数据区;其中,索引区可以常驻在内存中,包括若干索引单元,用于存储关键字段的特征值,数据区包括与各索引单元一一对应的数据单元,用于存储数据记录。参见图8,方法具体包括:
步骤301:计算待检索数据记录的关键字段的特征值;
本实施例中,使用预设算法计算待检索数据记录的关键字段的特征值。
具体地,预设算法为CRC32、CRC16、SHA1、MD5等算法,优选为CRC32算法。
例如,本实施例中,数据记录共33字节,包括8字节的商户号、4字节的终端号、5字节的收单行标识以及16字节的密钥,关键字段的特征值共4字节,其中,“商户号”为关键字段;已知关键字段“商户号”具体为001370248122708,用CRC32算法计算出的特征值是A0DC6439。
步骤302:将索引区的数据记录关键字段的特征值按页载入内存;
在本实施例中,由于Nand Flash是按页读写的,每一条索引单元,每一条数据记录的大小是确定的,所以存储区的一页所能存放的索引单元和数据记录也是确定的,索引单元和数据记录的大小不会超过存储区一页的大小。为避免出现跨页存储的情况,数据写入索引单元和数据单元时要进行数据对齐,即将索引单元长度和数据单元长度设置为大于或等于实际索引单元长度和数据单元长度并为页面大小的某个约数。
具体地,在本实施例中,假设存储区域大小为FS,则存储区域能放N=FS/(索引单元长度+数据单元长度)条记录,得到的结果向下取整数。索引区大小为N*索引单元长度,数据区大小为N*数据单元长度,数据区的起始地址为索引区的起始地址+N*索引单元长度。数据区的起始地址可以用上述公式计算得到,也可以进行指定。
更具体地,N*索引单元长度/页内最多字节数将得到的结果向上取整数得到索引区是由多少包含索引单元的页组成,N*索引单元长度/页内最多字节数/块内最多页数将得到的结果向上取整数得到索引区是由多少块组成。相应地,按照上述方法,能知道数据区所占的页数和块数。
例如,如图3所示,在本实施例中一个Nand Flash块最多存放32个Nand Flash页面,一个Nand Flash页面最多能够存放512个字节,索引区起始位置为0,一条索引单元长度为4字节,一个页面可以存放128条索引单元,已存储在索引区第一个块第一个页面的第一条索引单元的特征值是A0DC6439;相对应的数据单元长度为33字节,把数据单元长度从33字节扩充到64字节,即按64字节对齐,这样一个页面可以存放8条记录数据,存入的数据记录为0013702481227082000020708010045204471244442611F74447104445A5CB444。其中,索引区第一个块即为Nand Flash存储区域的第一个块。
其中,按页载入内存,包括:
步骤A1:将索引区第一块作为当前块,将索引区第一块的第一页作为当前页面;
步骤A2:将当前页面的数据载入内存;
步骤A3:判断当前页面是否为索引区第一块的最后一页,是则执行步骤A4,否则执行步骤A5;
步骤A4:判断当前块是否为索引区的最后一块,是则结束,否则将索引区下一个块的第一页作为当前页面,返回步骤A2;
步骤A5:将当前页面的下一页面作为当前页面,返回步骤A2。
步骤303:判断内存中是否存在与待检索数据记录的关键字段特征值相同的特征值,是则执行步骤304,否则结束检索;
具体地,在本实施例中,判断内存中是否存在与待检索数据记录的关键字段特征值相同的特征值,包括:
步骤B1:初始化当前偏移地址;
步骤B2:根据当前偏移地址读取一个索引单元长度的数据,判断读取到的数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤B3;
步骤B3:更新偏移地址为当前偏移地址加上读取的数据的长度,判断更新的偏移地址是否超过载入内存的数据的长度,是则载入内存的数据不包含特征值,否则返回步骤B2。
此外,在本实施例中,判断载入内存的数据是否包含特征值,还包括:
步骤C1:初始化遍历游标;
步骤C2:从内存中顺序读取长度等于索引单元的长度的数据,将读取到的数据作为当前内存数据;
步骤C3:判断当前内存数据和特征值是否相同,是则载入内存的数据包含特征值,否则执行步骤C4;
步骤C4:将遍历游标增加第一预设值,判断遍历游标是否超过第二预设值,是则载入内存的数据不包含特征值,否则返回步骤C2。
步骤304:确定待存储数据记录的关键字段的特征值对应的索引区的索引单元;
具体地,在本实施例中,可以根据偏移地址的值确定特征值对应的索引区的索引单元,也可以根据遍历游标确定特征值对应的索引区的索引单元。
步骤305:根据与待检索数据记录相同的关键字段的特征值所在的索引单元在数据区中定位到对应的数据单元所在的块号和页号;
具体地,在本实施例中,第n(n<=N)条索引单元的位置为n*索引单元长度,此条索引单元对应的数据单元的位置为N*索引单元长度+n*数据单元长度。
更具体地,(N*索引单元长度+n*数据单元长度)/页内最多字节数/块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的块号;(N*索引单元长度+n*数据单元长度)/页内最多字节数%块内最多页数,将得到的最终结果向上取整数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在的页号。
例如,在本实施例中,最多存储8192条数据记录的关键字段的特征值,即索引区占据了Nand Flash存储区域的两个块。根据上述公式算得,第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页。
步骤306:将定位的数据单元所在页的所有数据载入至内存,根据页内偏移地址查找、读取并显示与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录。
具体地,(N*索引单元长度+n*数据单元长度)%页内最多字节数得到与待检索数据记录相同的关键字段的特征值所对应数据区的数据单元的所在页的页内偏移地址。
例如,在本实施例中,将第一条索引单元的特征值A0DC6439对应数据单元的数据记录在存储区域的第三个块的第一页的所有数据即数据区第一个块的第一页的所有数据载入至内存,根据上述公式,算得页内偏移地址为33,即前33个字节为与待检索数据记录相同的关键字段的特征值所在的索引单元对应的数据单元的数据记录,载入出来的数据为
0013702481227082000020708010045204471244442611F74447104445A5CB444。
实施例七
本发明实施例七提供一种数据记录的存储装置,如图9所示,装置具体包括:
提取模块101,用于提取待存储的数据记录的关键字段;
计算模块102,用于计算待存储数据记录的关键字段的特征值;
第一判断模块103,用于判断索引区中是否包含存储有待存储数据记录的关键字段的特征值的索引单元;
具体地,数据记录的存储区域的索引区划分为若干块,每块又划分为若干页,第一判断模块103包括载入子模块,用于将索引区的数据按页载入内存;判断子模块,用于判断载入内存的数据是否包含待存储数据记录的关键字段的特征值;定位子模块,用于当判断子模块判断载入内存的数据包含待存储数据记录的关键字段的特征值时,确定待存储数据记录的关键字段的特征值对应的索引单元。
更具体地,判断子模块具体包括:
第一初始化单元,用于初始化当前偏移地址;
第一读取单元,用于根据当前偏移地址读取一个索引单元长度的数据和当第二判断单元判断更新的偏移地址没有超过载入内存的数据的长度时,根据更新偏移地址读取一个索引单元长度的数据;
第一判断单元,用于判断读取到的数据和待存储数据记录的关键字段的特征值是否相同;
第一更新单元,用于当第一判断单元判断读取到的数据和待存储数据记录的关键字段的特征值不相同时,更新偏移地址为当前偏移地址加上读取的数据的长度;
第二判断单元,用于判断更新的偏移地址是否超过载入内存的数据的长度。
定位子模块,具体用于根据偏移地址的值确定待存储数据记录的关键字段的特征值对应的索引区的索引单元。
判断子模块还可以包括:
第二初始化单元,用于初始化遍历游标;
第二读取单元,用于从内存中顺序读取长度等于索引单元的长度的数据和当第四判断单元判断遍历游标没有超过第二预设值时,从内存中顺序读取长度等于索引单元的长度的数据;
第一设置单元,用于将读取到的数据设置为当前内存数据;
第三判断单元,用于判断当前内存数据和待存储数据记录的关键字段的特征值是否相同;
第二更新单元,用于当第三判断单元判断当前内存数据和待存储数据记录的关键字段的特征值不相同时,将遍历游标设置增加第一预设值;
第四判断单元,用于判断遍历游标是否超过第二预设值。
定位子模块,具体用于根据遍历游标确定待存储数据记录的关键字段的特征值对应的索引区的索引单元。
定位模块104,用于当第一判断模块103判断索引区中包含存储有特征值的索引单元时,确定与存储有特征值的索引单元对应的数据单元;
具体地,第一判断模块103的定位子模块包括计算单元和定位单元。其中计算单元包括第一计算子单元和第二计算子单元。第一计算子单元用于计算索引单元的长度与数据单元长度的和,用存储区域的大小与得到的和相除,相除结果向下取整数得到存储区域存储记录的数量;
第二计算子单元,用于计算存储区域存储记录的数量与索引单元长度的乘积,得到索引区大小;
定位单元包括第一定位子单元、第二定位子单元和第三定位子单元。第一定位子单元,用于用遍历游标乘以数据单元长度得到第一乘积,用页内最多字节数乘以块内最多页数得到第二乘积,用第一乘积与索引区大小相加的和除以第二乘积,相除结果向上取整数得到待存储数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的块号;
第二定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积与索引区大小相加的和除以页内最多字节数,用相除结果对块内最多页数进行取余操作,所得结果向上取整数得到待存储数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的页号;
第三定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积对页内最多字节数取余,所得结果为待存储数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在页的页内偏移。
读取模块105,用于读取数据记录;
第二判断模块106,用于判断读取到的数据记录和待存储的数据记录是否相同;
第一写入模块107,用于当第一判断模块103判断索引区中不包含计算模块102计算得到的特征值时或第二判断模块106判断出读取到的数据记录和待存储的数据记录不相同时,将待存储数据记录的关键字段的特征值存入索引区;
在本实施例中,第一写入模块107,具体包括:
判断子模块,用于判断索引区最后一个特征值所在页是否还有空间存储;
第一载入子模块,用于当索引区最后一个特征值所在页还有空间存储时,将索引区最后一个特征值所在页的所有数据载入至内存;
第二载入子模块,用于当索引区最后一个特征值所在页还有空间存储时,将最后一个特征值所在页的下一页的所有数据载入至内存;
第一写入子模块,用于将待存储数据记录的关键字段的特征值顺序写入内存;
第二写入子模块,用于将内存中的数据写入索引区。
第二写入模块108,用于将待存储的数据记录存入数据区;
在本实施例中,第二写入模块108,具体包括:
第一判断子模块,用于判断数据区最后一条数据记录所在页是否还有空间存储;
第一载入子模块,用于当第一判断子模块判断数据区最后一条数据记录所在页还有空间存储时,将数据区最后一条数据记录所在页的所有数据载入至内存;
第二载入子模块,用于当第一判断子模块判断数据区最后一条数据记录所在页没有空间存储时,将数据区最后一条数据记录所在页的下一页载入至内存;
第一写入子模块,用于将待存储的数据记录顺序写入内存;
第二写入子模块,用于将内存中的数据写入数据区。
实施例八
本发明实施例八提供一种数据记录的查询装置,如图10所示,装置具体包括:
提取模块201,用于提取待查询的数据记录的关键字段;
计算模块202,用于计算待查询数据记录的关键字段的特征值;
第一判断模块203,用于判断索引区中是否包含存储有特征值的索引单元;
具体地,数据记录的存储区域的索引区划分为若干块,每块又划分为若干页,第一判断模块203包括载入子模块,用于将索引区的数据按页载入内存;判断子模块,用于判断载入内存的数据是否包含待查询数据记录的关键字段的特征值;定位子模块,用于当判断子模块判断载入内存的数据包含待查询数据记录的关键字段的特征值时,确定待查询数据记录的关键字段的特征值对应的索引单元。
更具体地,判断子模块具体包括:
第一初始化单元,用于初始化当前偏移地址;
第一读取单元,用于根据当前偏移地址读取一个索引单元长度的数据和当第二判断单元判断更新的偏移地址没有超过载入内存的数据的长度时,根据更新偏移地址读取一个索引单元长度的数据;
第一判断单元,用于判断读取到的数据和待查询数据记录的关键字段的特征值是否相同;
第一更新单元,用于当第一判断单元判断读取到的数据和待查询数据记录的关键字段的特征值不相同时,更新偏移地址为当前偏移地址加上读取的数据的长度;
第二判断单元,用于判断更新的偏移地址是否超过载入内存的数据的长度。
定位子模块,具体用于根据偏移地址的值确定待查询数据记录的关键字段的特征值对应的索引区的索引单元。
判断子模块还可以包括:
第二初始化单元,用于初始化遍历游标;
第二读取单元,用于从内存中顺序读取长度等于索引单元的长度的数据和当第四判断单元判断遍历游标没有超过第二预设值时,从内存中顺序读取长度等于索引单元的长度的数据;
第一设置单元,用于将读取到的数据设置为当前内存数据;
第三判断单元,用于判断当前内存数据和待查询数据记录的关键字段的特征值是否相同;
第二更新单元,用于当第三判断单元判断当前内存数据和待查询数据记录的关键字段的特征值不相同时,将遍历游标增加第一预设值;
第四判断单元,用于判断遍历游标是否超过第二预设值。
定位子模块,具体用于根据遍历游标确定待查询数据记录的关键字段的特征值对应的索引区的索引单元。
定位模块204,用于当第一判断模块203判断索引区中包含存储有特征值的索引单元时,确定与存储有特征值的索引单元对应的数据单元;
具体地,第一判断模块103的定位子模块包括计算单元和定位单元。其中计算单元包括第一计算子单元和第二计算子单元。第一计算子单元用于计算索引单元的长度与数据单元长度的和,用存储区域的大小与得到的和相除,相除结果向下取整数得到存储区域存储记录的数量;
第二计算子单元,用于计算存储区域存储记录的数量与索引单元长度的乘积,得到索引区大小;
定位单元包括第一定位子单元、第二定位子单元和第三定位子单元。第一定位子单元,用于用遍历游标乘以数据单元长度得到第一乘积,用页内最多字节数乘以块内最多页数得到第二乘积,用第一乘积与索引区大小相加的和除以第二乘积,相除结果向上取整数得到待查询数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的块号;
第二定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积与索引区大小相加的和除以页内最多字节数,用相除结果对块内最多页数进行取余操作,所得结果向上取整数得到待查询数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的页号;
第三定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积对页内最多字节数取余,所得结果为待查询数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在页的页内偏移。
读取模块205,用于读取数据记录;
第二判断模块206,用于判断读取到的数据记录和待查询的数据记录是否相同。
实施例九
本发明实施例九提供一种数据记录的检索装置,如图11所示,装置具体包括:
计算模块301,用于计算待检索数据记录的关键字段的特征值;
判断模块302,用于判断索引区中是否包含存储有特征值的索引单元;
具体地,数据记录的存储区域的索引区划分为若干块,每块又划分为若干页,判断模块302包括载入子模块,用于将索引区的数据按页载入内存;判断子模块,用于判断载入内存的数据是否包含待检索数据记录的关键字段的特征值;定位子模块,用于当判断子模块判断载入内存的数据包含待检索数据记录的关键字段的特征值时,确定待检索数据记录的关键字段的特征值对应的索引单元。
更具体地,判断子模块具体包括:
第一初始化单元,用于初始化当前偏移地址;
第一读取单元,用于根据当前偏移地址读取一个索引单元长度的数据和当第二判断单元判断更新的偏移地址没有超过载入内存的数据的长度时,根据更新偏移地址读取一个索引单元长度的数据;
第一判断单元,用于判断读取到的数据和待检索数据记录的关键字段的特征值是否相同;
第一更新单元,用于当第一判断单元判断读取到的数据和待检索数据记录的关键字段的特征值不相同时,更新偏移地址为当前偏移地址加上读取的数据的长度;
第二判断单元,用于判断更新的偏移地址是否超过载入内存的数据的长度。
定位子模块,具体用于根据偏移地址的值确定待检索数据记录的关键字段的特征值对应的索引区的索引单元。
判断子模块还可以包括:
第二初始化单元,用于初始化遍历游标;
第二读取单元,用于从内存中顺序读取长度等于索引单元的长度的数据和当第四判断单元判断遍历游标没有超过第二预设值时,从内存中顺序读取长度等于索引单元的长度的数据;
第一设置单元,用于将读取到的数据设置为当前内存数据;
第三判断单元,用于判断当前内存数据和待检索数据记录的关键字段的特征值是否相同;
第二更新单元,用于当第三判断单元判断当前内存数据和待检索数据记录的关键字段的特征值不相同时,将遍历游标增加第一预设值;
第四判断单元,用于判断遍历游标是否超过第二预设值。
定位子模块,具体用于根据遍历游标确定待检索数据记录的关键字段的特征值对应的索引区的索引单元。
定位模块303,用于当判断模块302判断索引区中包含存储有特征值的索引单元时,确定与存储有特征值的索引单元对应的数据单元;
具体地,判断模块302的定位子模块包括计算单元和定位单元。其中计算单元包括第一计算子单元和第二计算子单元。第一计算子单元用于计算索引单元的长度与数据单元长度的和,用存储区域的大小与得到的和相除,相除结果向下取整数得到存储区域存储记录的数量;
第二计算子单元,用于计算存储区域存储记录的数量与索引单元长度的乘积,得到索引区大小;
定位单元包括第一定位子单元、第二定位子单元和第三定位子单元。第一定位子单元,用于用遍历游标乘以数据单元长度得到第一乘积,用页内最多字节数乘以块内最多页数得到第二乘积,用第一乘积与索引区大小相加的和除以第二乘积,相除结果向上取整数得到待检索数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的块号;
第二定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积与索引区大小相加的和除以页内最多字节数,用相除结果对块内最多页数进行取余操作,所得结果向上取整数得到待检索数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在的页号;
第三定位子单元,用于用遍历游标与数据单元长度相乘得到乘积,用所得乘积对页内最多字节数取余,所得结果为待检索数据记录的关键字段的特征值所在的索引单元在数据区对应的数据单元所在页的页内偏移。
读取模块304,用于读取数据记录;
显示模块305,用于显示读取的数据记录。