流文件的如何分拆(100分)

  • 主题发起人 主题发起人 nchan
  • 开始时间 开始时间
N

nchan

Unregistered / Unconfirmed
GUEST, unregistred user!
有一流文件(几 G), 有不定长的记录组成,每个记录开头都有一个标记(‘RecordBeggin'),
如果快速把每个记录分拆成独立的文件?

流文件
RecordBegin ................ RecordBegin ......... RecordBegin ......

变成
文件一: RecordBegin ................
文件二: RecordBegin .......
文件三: RecordBegin ...........

关键:此流文件很大!

 
试验一下再发言。
 
你要求的是效率还是准确性?
如果说效率,算法就不好说了。我认为可以根据每一个文件的大概大小建立合适的窗口大小,每次取一个窗口的数据,然后判断其中是否有RecordBegin(你的流文件应该转义过了吧,否则可能出错哦)
 
定义好你的结构体,申明一个结构体变量myRecord,然后用TFileStream.Read(myRecord,sizeof(myRecord))每次读取一个,并用
TFileStream.position和TFileStream.size属性做比较确定是否到底最末尾.
 
我要的是效率,百思不得其解
 
你能不能先把你目前的做法说说,我看看能不能提些改进意见
 
to:peng_qs
流文件是别人生成的, 我无法定义它的结构。

to:plaw
我现在的做法是对每个byte进行检查,如果碰到"R"就看看每二个是不是“e",第三个是不是
"c" ..............
1G byte就要循环多久啊!!
 
这这这,这个效率也太低了吧?
你看这样如何?
比如,每次取1000Byte,然后判断有没有RecordBegin,当然还要考虑最后的有没有部分的RecordBegin
这也效率不就高多了吗?我前面所说的窗口大小就是指这个,因为太大的话可能其中包括几个RecordBegin,或者搜索效率不高,太小的话,效率低
 
就是因为要考虑到有没有部分的RecordBegin这个问题,才是最可怕的事情。 有没有现成的
例子?
 
后退
顶部