嵌入设备下如何实现的快速检索
前提:嵌入设备,CPU400,每条记录内容为tagData,共有100万甚至更多的记录,
要求:根据关键字检索szText字段,如何做到1s内能完成检索,并返回符合要求的记录.
不涉及数据库,数据自己存在文件里。
typedef struct tagData{
int iTextLen;
int iOtherLen;
char* szText; //关键字
char* szTextSpell;//拼音
char* szDetails;
}Data;
小弟将数据按 Data依次存储完,并根据szText建了一个索引表(大该为1:1),速度虽然满足了,却也引来了新的问题.
如果我还要在检索Data结构里面的某个字段(如szTextSpell),又需重新建一个索引,这样容量肯定不满足要求了。
小弟想了很久,始终得不到一个较完美的方法,哪位大虾有接触过此问题的还请指导小弟下,给个思路也行,不甚感激啊.
[解决办法]
说说具体第一个索引表是如何建的,按现在的情况,只能优化第一个索引表以求放下多个索引表。
一般来说,没有必要建立1:1的索引表。
[解决办法]
这是数据结构和优化算法结合的问题了,有挑战性。第一次碰到,thinking....
[解决办法]
typedef struct tagData{
int iTextLen;
int iOtherLen;
char* szText; //关键字
char* szTextSpell;//拼音
char* szDetails;
}Data;
我同事以前做排序的时候结构都是固定的,
没有指针型的类型。都是限定大小的。例如 char szText[20];
全部都是以BYTE格式处理。
具体怎么做的不太清楚。
好象用了树排序。
速度非常快。(用在gps导航中,检索全国数据)
[解决办法]
我说个建议,大家讨论下,这里肯定要用到数据库的一些原理,既然你第一次建立索引用的是szText,并把他作为关键字,那么也可以根据需要在建立索引的时候,用szText和szTextspell共同作为主键建立索引,然后查找,速度肯定要优于重新建一张索引表,当然,这个方法毕竟是静态的,没有什么意义,还有个方法,就是动态修改索引表,
我的思路是,首先把你的结构体增加2项typedef struct tagData{
int iTextLen;
int iOtherLen;
char* szText; //关键字
char* szTextSpell;//拼音
char* szDetails;
Data *front;
Date *next;
}Data;
相当于添加2个指针,这样就能在内存中建立张链表,用链表查找肯定要快于直接读取文件,然后建立索引,根据关键字建立索引,当关键字改变时,可在原索引表上添加,修改,删除,这些步骤,这就类似与数据库操作中的GROUP BY操作,随时根据需要修改索引表刷新索引表。
[解决办法]
不管100万条数据怎么管理,毕竟有最少有100万条记录, 最快的方式莫在于 将多变少, 将大变小,将遍历变为直接取, 或者最少的取操作, 那么将浪费了空间 必须需要空间换速度的方式。那么你在管理和维护数据方面将需要做的更多。
关于排序这里 也许就需要折中考虑了,也许只能进行局部排序了, 看看别人是否有好的想法。。。
[解决办法]
空间换时间,时间换空间。本来两者就很难兼顾。
假设每个关键字,都做一个索引列表,保存在文件里,那么首先就需要占用较多的存储空间,而真的索引发生时,需要将其读取到内存中(不然,速度无法满足),那么对内存的要求又是个关键点。
简单的说,你们项目可以接受的索引时间和占用存储空间及内存空间大概是多少?还要包括你们的工作平台,CPU型号,主频,FLASH,SDRAM速度等。让有经验的朋友帮忙鉴定一下是否可以达到。如果远远超出技术极限,那光是在这里探讨算法是没有意义的。