请问变长记录用什么格式及算法存储较好。
  比如,像邮件软件存储邮件,每封邮件大小差别可能会很大。
要能既不太浪费空间,又要能快速检索。
  邮件还算好的,像别的信息可能还会经常修改、删除等,可能会有大量数据移动。
  应该用什么样的算法较好?
  我自己考虑肯定要用索引,指向每个记录的头部。问题是在修改记录时,就
比较麻烦。如某记录比原来多了100字节,如果采用链式方式可能使存储结构太复
杂了吧?
  如果采用重新分配的方式,则该记录后的所有记录都要移动,索引也要重建。
  是否这样好一些,使用块式+链式存储,设每块大小为N,总是为一个记录
分配N的整数倍的空间,如设块为128字节,某记录80字节,增为100字节,记录
不用移动,记录增为140字节,分配256字节,增加的新块放在文件尾部,用链表连
起来。可以设置一功能,对文件结构优化时,再分配为连续块。
  但感觉还不是很成熟,有没有可参考的例子呀?像outlook等软件里的结构
是否和这个思路类似呀?
  网上有没有例子呀?
  请教了。

解决方案 »

  1.   

    我觉得你的问题可以在文件系统中找到答案。
    文件系统的储存也是要解决同样的问题。
    文件要经常改变大小。要如何分配才能合理使用连续的硬盘空间。对应关系如下:
    FAT表------你的记录的索引
    硬盘------你的整个文件
    簇-------你的记录的最小分配单位你的上面的思路就比较象文件系统的思路了。
    比较成熟的文件系统分配算法可以参考操作系统方面的书。删除记录的时候并不移动已有记录,而是把删除的记录连接到空闲链中,也不改变文件大小。
    分配记录的时候在空闲链中分配。如果空闲链不够就在文件末尾分配一个新的空闲空间用于储存该记录。
    分配的记录是一个固定大小的倍数,这样比较有效率。一个大记录被分为若干个固定大小的块。储存的时候以块为单位储存。优化的时候就像硬盘碎片整理一样,就像你所说的,分配为连续块。总的来说我是很赞同你的做法的。就这么做吧。不过太麻烦了。
      

  2.   

    是,我就是参考了文件系统的想法。
      但在一个小程序中这样作太复杂了。
      你用过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
      英文注册版有源码    
      

  3.   

    CString
    CStringArray
    CFile
    CArchive
    以上几个足可以处理你的问题
      

  4.   

    干脆每个记录用一个文件保存,再用一个文件作为索引。
    把所有细节交给操作系统处理得了。
    比如
    rec1.dat, rec2.dat, rec3.dat...
    index.dat
    我觉得这样可能比较简单。
      

  5.   

    用链表的格式,然后用Archieve读写文件(特别是对图形图象)~~~~