嵌入设备下如何实现的快速检索

hqulyc 2008-06-24 04:46:17
前提:嵌入设备,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),又需重新建一个索引,这样容量肯定不满足要求了。

小弟想了很久,始终得不到一个较完美的方法,哪位大虾有接触过此问题的还请指导小弟下,给个思路也行,不甚感激啊.


...全文
148 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
slyzhang 2008-06-25
  • 打赏
  • 举报
回复
不管100万条数据怎么管理,毕竟有最少有100万条记录, 最快的方式莫在于 将多变少, 将大变小,将遍历变为直接取, 或者最少的取操作, 那么将浪费了空间 必须需要空间换速度的方式。那么你在管理和维护数据方面将需要做的更多。


关于排序这里 也许就需要折中考虑了,也许只能进行局部排序了, 看看别人是否有好的想法。。。
slyzhang 2008-06-25
  • 打赏
  • 举报
回复
CPU400,
共有100万甚至更多的记录, 1s 内完成检索
关键字 char* Text

这个任务是比较严峻, 100万条记录
排除读取数据的时间,假设都在内存,

权当内存检索,如果能将 Text按照每个字母进行列表,那么 假如你的Text长 6位 那么 不需要遍历,直接从链表中取, 下一个字母,再从链表中取, 这样就成了叉叉树了


这样应该可以满足要求了吧, 但考虑上读取这么多的数据 的速度方面,也许需要将这些索引信息和真实的数据分开,至于怎么就可以直接娶到数据,那就看自己的方式了。



仅仅是思路。。。。 期望对你有用。

shuiyan 2008-06-25
  • 打赏
  • 举报
回复
1:1的索引空间还想再减小,那可以尝试引入“压缩”算法,不过没有具体研究过,如果你也是,那就得从头开始学及应用了。

拼音检索和汉字关键字是可以联系,但是如果希望加入的是别的关键字索引呢?因为你问的是“如果我还要在检索Data结构里面的某个字段(如szTextSpell),又需重新建一个索引”,那就不能以拼音和关键字这样的特殊关系来考虑了。

还是老老实实的用树排序吧,虽然耗点资源,只要解决速度问题就行了。
dthxman 2008-06-25
  • 打赏
  • 举报
回复
我说个建议,大家讨论下,这里肯定要用到数据库的一些原理,既然你第一次建立索引用的是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操作,随时根据需要修改索引表刷新索引表。
lenux 2008-06-25
  • 打赏
  • 举报
回复
typedef struct tagData{
int iTextLen;
int iOtherLen;
char* szText; //关键字
char* szTextSpell;//拼音
char* szDetails;
}Data;

我同事以前做排序的时候结构都是固定的,
没有指针型的类型。都是限定大小的。例如 char szText[20];
全部都是以BYTE格式处理。

具体怎么做的不太清楚。
好象用了树排序。
速度非常快。(用在gps导航中,检索全国数据)
hqulyc 2008-06-25
  • 打赏
  • 举报
回复
TO dthxman:
如果要建索引,肯定是已经先建立好了,然后存储进文件, 当然是通过你的关键字而直接判断要读取那部分索引数据了,这样就减少了读取的数据量,也减少了比较的次数了。

TO slyzhang:
用空间换取速度,这种方式可以做到,我也实现了。索引创建完有1:1的大小,只是看到别人在此基础上又优化了存储空间,才让我感叹啊!~

TO shuiyan:
这个肯定是可以达到要求的,因为lenux 这位哥们有提到过是可以实现,且我也知道别人有实现了。所以才一直想知道如何做到,还有一点就是用拼音检索和关键字肯定是建立了汉字跟拼音的联系,那么就只需共用一个索引了。



shuiyan 2008-06-25
  • 打赏
  • 举报
回复
空间换时间,时间换空间。本来两者就很难兼顾。
假设每个关键字,都做一个索引列表,保存在文件里,那么首先就需要占用较多的存储空间,而真的索引发生时,需要将其读取到内存中(不然,速度无法满足),那么对内存的要求又是个关键点。

简单的说,你们项目可以接受的索引时间和占用存储空间及内存空间大概是多少?还要包括你们的工作平台,CPU型号,主频,FLASH,SDRAM速度等。让有经验的朋友帮忙鉴定一下是否可以达到。如果远远超出技术极限,那光是在这里探讨算法是没有意义的。
shuiyan 2008-06-24
  • 打赏
  • 举报
回复
这是数据结构和优化算法结合的问题了,有挑战性。第一次碰到,thinking....
hqulyc 2008-06-24
  • 打赏
  • 举报
回复
to 91program :
我有看过别人能做到快速检索,且其数据量和我真实数据一样大,我敢肯定其也做了索引,是只它做了索引后似乎也优化了真实数据,
当然他的索引方式肯定较优于我,至少数据量比我小.
既然有人可以做到,肯定是有方法,小弟愚钝,一直没想到更好的方法,所以在此希望有人能帮忙"破解"下.
91program 2008-06-24
  • 打赏
  • 举报
回复
说说具体第一个索引表是如何建的,按现在的情况,只能优化第一个索引表以求放下多个索引表。

一般来说,没有必要建立1:1的索引表。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧