我要对一个大的文件(先命名Bigfile.dat)进行操作包括 :主要查找,修改,写入
面临的问题
我要对其进行查找,就需要建立一个索引文件(bigindx.dat)对其关键字索引.
因为bigfile.dat的记录是一条一条的,而且都很大,又很多
我是这样做的索引:关键字+这条记录在bigfile.dat中的位置(position)和长度(length).
这样通过查找索引文件 可以直接定位到bigfile.dat记录的位置,提高些速度.
这样看起来是可以的
问题开始:
1: 可是我要对文件进行修改,而且修改只会使记录加长.就是文件里每一条记录的长度都是可变的,
一旦要修改某一条记录.那么从这条记录以后的记录都要修改从文件里向后移动(你问我为什么
不在写记录的时候多留出空间呢,因为修改后一般记录都会变横长的,我没法预留空间,再说也太浪费了
) 能不能把这么麻烦的问题简单化吗?
2:即使我向上面那样做了可是,bigfile.dat里记录的位置已经移动了,我的索引文件也就作废了啊
难道我还要全部更新索引文件了吗?
有没有更好的作索引文件的方法呢?怎么做?
大家不要建议我用数据库因为我都建议过了,就是要用文件了,定死了,而且没有索引文件也是很困难的
因为文件要过很长时间才能备份依次的.数据又频繁很快就很大了啊.
大家看了不要头大,我给大家氨基酸补充能量
面临的问题
我要对其进行查找,就需要建立一个索引文件(bigindx.dat)对其关键字索引.
因为bigfile.dat的记录是一条一条的,而且都很大,又很多
我是这样做的索引:关键字+这条记录在bigfile.dat中的位置(position)和长度(length).
这样通过查找索引文件 可以直接定位到bigfile.dat记录的位置,提高些速度.
这样看起来是可以的
问题开始:
1: 可是我要对文件进行修改,而且修改只会使记录加长.就是文件里每一条记录的长度都是可变的,
一旦要修改某一条记录.那么从这条记录以后的记录都要修改从文件里向后移动(你问我为什么
不在写记录的时候多留出空间呢,因为修改后一般记录都会变横长的,我没法预留空间,再说也太浪费了
) 能不能把这么麻烦的问题简单化吗?
2:即使我向上面那样做了可是,bigfile.dat里记录的位置已经移动了,我的索引文件也就作废了啊
难道我还要全部更新索引文件了吗?
有没有更好的作索引文件的方法呢?怎么做?
大家不要建议我用数据库因为我都建议过了,就是要用文件了,定死了,而且没有索引文件也是很困难的
因为文件要过很长时间才能备份依次的.数据又频繁很快就很大了啊.
大家看了不要头大,我给大家氨基酸补充能量
bitfile定义一个结构: IsDelete: Boolean;
ContentLen: Integer;
Content: PChar;IsDelete表示当前的记录是否给删除了。
ContentLen是Content长度,记录了内容在bigfile中的长度 + 1,为什么+1,作为Content的结束符。以后修改时,将IsDelete置True,然后重新写入到bigfile的文件后面,相应的修改bigindex中的Offset,这样的话,不就行了。然后再做一个附加功能,就是压缩、整理这个bigfile,如果修改敏繁,那么产生的文件会越来越大,那么你得根据bigindex重新将bigfile写一遍,将IsDelete为True的过滤掉就行了在程序自己再具体些
然后修改其相应的offset那么offset 还是在会很大的就是说他记录的是bigfile中靠后的位置啊。即使以后压缩删掉IsDelete置True的记录,可是新记录还是会在bigfile中新的offset的位置啊就是说bigfile的大小没有变啊(因为新记录的offset就已经说明文件的大小了啊),删掉记录占的空间还是保留在bigfile里啊。你的意思是说在删掉IsDelete置True的同时还是要把后面的数据记录还是向前移动吗?那不又要修改bigindex了吗?
在提供一个Pack的函数,对两个文件进行重构,真正删除那些标记文件。
TO:copy_paste(木石三)
chechy(简简单单的活)
给我很多启发!!!!
修改保存必须需要索引,这是不可避免的,不要想着什么都不用改。Pack功能就是将内容重新检索,将已经不需要的内容去掉就是了。涉及到具体的代码,我也帮不了你