老问题:如何高速获得大文本文件的行数(30分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
假设文本文件大小是200M的Log文件。
 
procedure count(const txt: string);
var
F:TextFile;
s:string;
line:integer;
begin
Assign(F,txt);
reset(F);
line:=0;
while not seekeof(F) do
begin
if seekEoln(F) then
readln;
readln(F,s);
if seekeof(F) then
break
else
inc(line);
end;
closefile(F);
result:=line;
end;
给分?
 
我只需要行号就行了,这里何必要有
readln(F,s);呢?

代码是否可以进一步优化?
 
数回车。其实还是要全读一遍。
 
抽样统计平均行长,预测一下行数。
 
感谢wuyi的额外建议,这点我怎么没有想到?

To soul:
数回车我知道,但没有必要将内容读到string里面去,这样不是更加浪费cpu时间吗?


另:如果使用api的openfile,readfile速度是否会明显加快?
 
果使用api的openfile,readfile速度是否会明显加快
不会
 
with TStringList.Create do //with TRichEdit.Create do (TStringlist好像不能大于多大的文件)
try
LoadFromFile(FileName);
Result := Count;
finally
Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var b:^Byte;
Mem:TMemoryStream;
Count,i:Integer;
begin
Mem:=TMemoryStream.Create;
try
Mem.LoadFromFile('C:/SCANDISK.LOG');
b:=Mem.Memory;
Count:=0;
i:=0;
While i<Mem.Size do
begin
if b^=13 then
Inc(Count);
Inc(b);//只需要移动指针就可以了!
Inc(i);
end;
ShowMessage(Inttostr(Count));
finally
Mem.Free;
end;
end;
 
楼上好多人都用了XX.LoadFromFile的方法,请注意这样是非常耗费内存,假设系统内存
是256M,windows自己用了128M,剩下的只有128M,如果将200M文件读入?你可能会说
windows有虚拟内存,但是虚拟内存的本质就是硬盘空间,想想将剩下的72M文件写到硬盘
里面去需要多少时间?
 
多人接受答案了。
 
后退
顶部