请教:一个关于文件碎片整理的问题

mchman 2005-07-11 07:32:55
我的系统使用文件来存储数据,每条数据都是定长的,可以看作是一条记录.
数据量比较大,大约为1000w条数据,总占用磁盘空间约3G,我把它分成10个文件存储,每个存储100w
由于有些数据会被系统删除,我的方式是删除的数据只是在内存中打了删除标记,并不从文件中删除.文件定时整理,清除已经删除的数据
我只能想到的方法是,从旧的文件中把没有删除标记的纪录拷贝到新的文件中,从而使文件中的数据比较精凑,有点像碎片整理,但由于数据量大,io操作太频繁.请教:有没有更好的方法可以实现呢?我认为我的方法不是一个好方法,我也不想这样用.
...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenlmmx 2005-07-13
  • 打赏
  • 举报
回复
做过一段oracle数据管理,知道它的文件管理一点的线索,随便说说.
对于大数据量的管理,必须得建立一套比较完整的体系,来达到数据的增,删,改操作.
比如oracle一般逻辑由表空间来管理数据储存,而表空间在物理层面上又由一个或多个数据文件组成.
文件下还有段,段又由块组成.这已经是有几层的构建.而我觉得最欣赏的是在块头有个数据结构(可以简单认为是链表)叫freelist.有个参数pctfree控制数据是否能在这个块上插入.如果数据占用了整个块空间的比如80%,这时这个块将不允许任何新的数据插入.因为它要预留一定的空间防止修改数据时空间的不足.而另一个参数ptcused则相反,如果数据占用了整个块空间下降到只有比如40%,这个块将又将允许新的数据插入.而块头上还有记录块内每个block的空间占用情况.如果删除直接在块头上做上标记即可.
不说了,内容太多.总而言之建立完善的索引结构非常重要,不要怕麻烦.性能的提高何止千倍.其实有些观点楼上的已经提到.
Shining 2005-07-13
  • 打赏
  • 举报
回复
arrowcy的方法我能想到,我觉得实现起来也比较简单。

楼上的方法很好,但是实现起来又多了点东西,会麻烦的。这种方法一般都不是我这个懒热会首先考虑到的。哈哈~~
megaboy 2005-07-13
  • 打赏
  • 举报
回复
恩,arrowcy的方法的确比楼主的方法前进了一大步,效率好多了。不过,我认为arrowcy的方法还可以进一步改良,没有必要为每个记录打一个删除标记,这样所造成的IO操作仍有不少。

我的改进方法是,设立一个删除记录文件,用这个文件专门登记被删除记录的序列号,这样一来,删除一条记录时只需要把该记录的序列号简单地添加入文件里面就行了,从而省去了查找实际记录和打上删除标记的IO操作,也节省了空间。这个删除记录文件应该具有队列(FIFO)的组织形式,新添加记录时从文件头读取可用序列号,然后计算偏移量,再用新记录覆盖该序列号所属的空间,删除的序列号从文件末尾添加,头指针的指向无须固定在文件头,只需要把当前头记录的偏移量放在文件中一个特定的位置,让它所表示的偏移量在文件里不断地循环就行。

对于删除记录文件数据的排列方式,还可以进一步开发,比如让连续的序列号尽量按顺序排列在一起,这样会形成已删除记录块,如果把这些记录块的相关信息记录下来,还可以为新添加的记录找到最优的存放位置,提高空间利用率。
arrowcy 2005-07-12
  • 打赏
  • 举报
回复
如果那个数据长期都要占用很大的容量,经常增加和删除新的数据的话,没必要把它删除吧
就一直让他占用3个G左右的空间,不用整理,只要在添加记录的时候查找一个标有删除标记的,把它覆盖了就行了
这种方法就和操作系统管理文件一样,删除文件的时候并不真的删除,只需要做上标记,以后用的时候知道他可以被覆盖就行了。
megaboy 2005-07-12
  • 打赏
  • 举报
回复
楼主一开始的思路就不是很好,1000w条记录,不应当还用文件来存储了,应该用数据库,这才是正道。用文件,不利于添加和删除,注定要频繁的IO操作,即使用系统输入输出函数也一样。
mchman 2005-07-12
  • 打赏
  • 举报
回复
arrowcy的方法值得一试,非常感谢
非常感谢megaboy的建议,但是实际情况是不允许我使用数据库,在文件中我可以快速定位,因为我在内存中建了索引,使用数据库的话,在海量数据的时候,性能下降比较厉害,大的商用数据库如oracle,由于预算等原因,没有采用

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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