如何写一个轻量级的数据库,效率速度优先(200分)

  • 主题发起人 errorcode
  • 开始时间
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
需要实现类似如下功能:
1: 一个表,有固定N个字段,有int,string,do
uble.先不考虑string的不定长的问题,以定长来解决.
2:对此表增加,修改,删除
 3:表的记录需要100W以上,最好是1亿
 4:检索效率问题,根据ID,在100W条记录检查速度不多于1秒
5:不是用数据库来实现
俺正看着数据结构的B树代码,不过不太懂,有没有这方面的高人指点迷津.谢谢.
比如一个表:
type
PMyInfo = ^TMyInfo;
TMyInfo = record
ID: Integer;
DateTime: Cardinal;
Name: array [0..11] of Char;
end;

按之前检索的写法就是
for I := 0 to List.Countdo

 if PMyInfo(List)^.ID = ID then
break;
这个检索的速度,自己都不能忍受了...
Hash检索效率最快,但问题是会根据SizeOf(TMyInfo)的值,而占内存越来越大,如果都放在内存的话.
这样只能转储于外存.但不太清楚如何做了.
 
 
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
 3:表的记录需要100W以上,最好是1亿
 4:检索效率问题,根据ID,在100W条记录检查速度不多于1秒
--------------------------------------
能做到的方法就是,你先用 Delphi 写一个数据库,再用 Delphi 调用这个数据库
 
Z

zhaokaien

Unregistered / Unconfirmed
GUEST, unregistred user!
你的要求是比较高的,用哈希的办法恐怕实现起来有难度,但是的确是最好的办法,
有关B树的基础知识很多数据结构书都有说,我建议你下载一本老外写的delphi算法与数据结构的书,写的非常好,讲的很好懂,
 
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
doing...
楼上推荐一下.
我现在觉得是HASH值的处理问题.一个HASH值域是: Cardinal, 即0..4G的范围,这样全在内存表示肯定不可能的.
之前听了一些前缀树(好像是)的方法,好像是进行值域划分,感觉就是二级HASH差不多,好像是这意思,但还是不太懂.不考虑与外存转转换,检索的问题的话,我想应该是这种速度最快了.
不知有没人弄过了?
 
C

chen_liang

Unregistered / Unconfirmed
GUEST, unregistred user!
佩服,估计是不可能的,delphi里没有提供hash容器类,先把这个写出来再说吧,可以参考java的代码!
 
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的说的容器,你看看IniFiles.THashStringList是不是你所想要的.
这个容器类没有关系,标准的一些容器类代码只是讲些标准操作,一些只用于内存,作100W级存储以上,我觉得需要有外存了.我是这么想的,不知有没错.
 
Q

qizhao_2001

Unregistered / Unconfirmed
GUEST, unregistred user!
要上到1G,当然不能所有数据一次装入内存了,
这个东西看来要先设计一个好的类数据库的工具,能够内存换页之类的,还有就是设计高效的索引查寻,
有难度...
关注中......
 
D

dreamfly1024

Unregistered / Unconfirmed
GUEST, unregistred user!
嵌入数据库一大堆, 自己去搜一个好了
 
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上说的是.
 

李翔鹏

Unregistered / Unconfirmed
GUEST, unregistred user!
自己开发数据库有必要吗
 
C

chen_liang

Unregistered / Unconfirmed
GUEST, unregistred user!
{ THashedStringList - A TStringList that uses TStringHash to improve the
speed of Find }
这就是delphi提供的容器类?它只是为了提供TStringList检索速度而继承的子类,严重同意李翔鹏,没必要开发数据库,你可以加入某个软件公司进行面向对象的数据库研究和开发,面向关系的数据库已经db2,mssql,oracle天下拉!
 
S

sky1001

Unregistered / Unconfirmed
GUEST, unregistred user!
自己开发数据库在一些特殊需要的时候是必须的。比如,需要自己的数据库资料不被他人知道。虽然,一些数据库提供了加密方法,但是基本上都是比较公开的方法,安全性来说相对差一些。所以这个时候,自己开发一个轻量级的数据库也是不错的选择。
Hash表当然是比较好的方式,至于内存问题,如果你的数据量很大,可以采取磁盘数组的方式来存放这个hash表。
还有,DELPHI本身提供的数据结构不多,而且实现方法也不是最好的,比如TQueue就是用了TLIST来实现,不过效率不高。 所以,需要自己多做一些工作,比如,为了提高效率,自己建立内存管理器,用流的方式实现磁盘数组,然后把hash表实现在这个磁盘数组里。至于hash表的实现也有很多选择,线性探测是比较简洁的方式,效果也不错。当然还有,链式,平衡树(红黑树)方式。要做的工作比较多。需要好的基础功。
 
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
2 chen_liang
拜托,我是想实现一个轻量简单的数据结构,别拿你那一套思想来影响别人好不好.照你的意思,写财务有金蝶,用友,那别人不要写财务软件了?浏览器有IE,那别人不要用Maxthon,Firefox了?什么逻辑啊
容器类就那几个基础的数据结构,明白关系了,自己写一个也行,不行你GG一下找找,一堆的代码,不用别人说吧.

 我只想问怎么实现一个轻量结构及一些关键的东西,实现不行,空间换效率谁不会.累,怎么会摊上这事.我想实现自有道理,难道每次问问题,还要跟别人说:我要写Windows,我要写Oracle,什么跟什么嘛.
 
E

errorcode

Unregistered / Unconfirmed
GUEST, unregistred user!
2 sky1001
那些不是问题,我是准备找找嵌入数据库代码看看里面的结构,我想一些东西的我还是会的,里面剥离点东西.不过这段时间没怎么时间.
 
S

sky1001

Unregistered / Unconfirmed
GUEST, unregistred user!
2 errorcode
有基础最好了。我一直也想写一个自己用的轻量级的数据库。只是现在时间不允许。有问题我们一起探讨一下。
 
D

dreamfly1024

Unregistered / Unconfirmed
GUEST, unregistred user!
说老实话, 我很早以前写过一个小数据库, 功能也蛮全的.
后来仔细看了一下微软的 SQL Server (我写完之后微软才发布的), 硬是吓了一跳, 不敢再碰这种东西了.
这不是个人可以玩玩的领域.
根据需求, 找一个开源的嵌入数据库, 改造即可.
当然要注意版权问题了.
 

Similar threads

S
回复
0
查看
741
SUNSTONE的Delphi笔记
S
S
回复
0
查看
686
SUNSTONE的Delphi笔记
S
S
回复
0
查看
649
SUNSTONE的Delphi笔记
S
S
回复
0
查看
638
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部