请问变长记录用什么格式及算法存储较好。
比如,像邮件软件存储邮件,每封邮件大小差别可能会很大。
要能既不太浪费空间,又要能快速检索。
邮件还算好的,像别的信息可能还会经常修改、删除等,可能会有大量数据移动。
应该用什么样的算法较好?
我自己考虑肯定要用索引,指向每个记录的头部。问题是在修改记录时,就
比较麻烦。如某记录比原来多了100字节,如果采用链式方式可能使存储结构太复
杂了吧?
如果采用重新分配的方式,则该记录后的所有记录都要移动,索引也要重建。
是否这样好一些,使用块式+链式存储,设每块大小为N,总是为一个记录
分配N的整数倍的空间,如设块为128字节,某记录80字节,增为100字节,记录
不用移动,记录增为140字节,分配256字节,增加的新块放在文件尾部,用链表连
起来。可以设置一功能,对文件结构优化时,再分配为连续块。
但感觉还不是很成熟,有没有可参考的例子呀?像outlook等软件里的结构
是否和这个思路类似呀?
网上有没有例子呀?
请教了。
比如,像邮件软件存储邮件,每封邮件大小差别可能会很大。
要能既不太浪费空间,又要能快速检索。
邮件还算好的,像别的信息可能还会经常修改、删除等,可能会有大量数据移动。
应该用什么样的算法较好?
我自己考虑肯定要用索引,指向每个记录的头部。问题是在修改记录时,就
比较麻烦。如某记录比原来多了100字节,如果采用链式方式可能使存储结构太复
杂了吧?
如果采用重新分配的方式,则该记录后的所有记录都要移动,索引也要重建。
是否这样好一些,使用块式+链式存储,设每块大小为N,总是为一个记录
分配N的整数倍的空间,如设块为128字节,某记录80字节,增为100字节,记录
不用移动,记录增为140字节,分配256字节,增加的新块放在文件尾部,用链表连
起来。可以设置一功能,对文件结构优化时,再分配为连续块。
但感觉还不是很成熟,有没有可参考的例子呀?像outlook等软件里的结构
是否和这个思路类似呀?
网上有没有例子呀?
请教了。
解决方案 »
- 请教个思路,方法问题
- VC2008如何把所有define放在一起?
- 导入ntdll.dll出现-意外的“FARPROC”类型
- 如何使用dll中的字符串资源呢?
- 我数据库内有许多结构一样的表,B200407,B200408,B200409,分别保存不同月份的数据,现在我想这些表中查符合的记录,该如何写SQL语句,谢谢!
- 怎样得到数据库中一共有多少条记录 ACCESS ADO
- 单文档创建CEdit、CComboBox等控件不显示,求助!
- $$文件复制问题,立即给分$$
- 如何将成员函数的代码分离出来?
- dll共享数据段中是否可以使用指针或者STL
- 发送包发不出去,高手请进!
- 用户输入一些中英文本,怎样判断哪些是汉字??
文件系统的储存也是要解决同样的问题。
文件要经常改变大小。要如何分配才能合理使用连续的硬盘空间。对应关系如下:
FAT表------你的记录的索引
硬盘------你的整个文件
簇-------你的记录的最小分配单位你的上面的思路就比较象文件系统的思路了。
比较成熟的文件系统分配算法可以参考操作系统方面的书。删除记录的时候并不移动已有记录,而是把删除的记录连接到空闲链中,也不改变文件大小。
分配记录的时候在空闲链中分配。如果空闲链不够就在文件末尾分配一个新的空闲空间用于储存该记录。
分配的记录是一个固定大小的倍数,这样比较有效率。一个大记录被分为若干个固定大小的块。储存的时候以块为单位储存。优化的时候就像硬盘碎片整理一样,就像你所说的,分配为连续块。总的来说我是很赞同你的做法的。就这么做吧。不过太麻烦了。
但在一个小程序中这样作太复杂了。
你用过mybase软件吗?http://www.wjjsoft.com/
我觉得它作得还不错,可惜不给源码。
URL http://www.vckbase.com/code/downcode.asp?id=1530
这个地方有另一个类似程序的源码,功能简单一些。还没仔细看它的程序。
不过感觉还不是很满意。
mybase中使用了tinydb
http://www.sdf.net.cn/~science/soft/chinese/index.html
可惜只是for delphi 和bcb
英文注册版有源码
CStringArray
CFile
CArchive
以上几个足可以处理你的问题
把所有细节交给操作系统处理得了。
比如
rec1.dat, rec2.dat, rec3.dat...
index.dat
我觉得这样可能比较简单。