快速写入和读出大文本文件的有什么好方法?(20分)

  • 主题发起人 主题发起人 TENTODBV
  • 开始时间 开始时间
T

TENTODBV

Unregistered / Unconfirmed
GUEST, unregistred user!
能否跳过SL:TStringList,在生成每行字符串时就写入某个Buffer,最后整块存储。
procedure TForm1.Button1Click(Sender: TObject);
var
i,T:integer;
SL:TStringList;
begin
T:=GetTickCount;
SL:=TStringList.Create;
for i:=0 to 1000000 do
begin
SL.Add(Format('%.15d',));
end;
SL.SaveToFile('c:/temp/test.txt');
Form1.Caption:='写入完成'+FloatToStr((GetTickCount-T)/1000)+'秒';
end;
 
本人测试的最好方法:
用API OpenFile ReadFile WriteFile
在Delphi里对其进行了简化封装
FileOpen,FileRead,FileWrite
 
能否给出代码?
 
用流的方式
 
关注此贴内容。用流的方式如何实现的呀?
 
TextFile WriteLn AssignFile Rewrite CloseFile
 
用文件流吧
var
FileStream: TFileStream;
begin
if not FileExists(FileName) then FileStream:= TFileStream.Create
FileName, fmCreate)
else
FileStream:= TFileStream.Create(FileName, fmOpenReadWrite);
FileStream.Position:= FileStream.Size;
FileStream.Write(PChar(yourContent)^, Length(yourContent));
FreeAndNil(FileStream);
end
 
赞同NeutronDelphi的意见
用openfile先获得文件句柄
用readfile循环读取固定个字节
写入的时候直接修改值即可。
delphi里甚至有封装了该API的函数,fileopen,fileread
使用起来还是非常方便的
 
能给出实现我的问题中的例子同样功能的代码吗?
 
先表示抱歉,我做的没你的快,我程序如下:
procedure TForm1.Button3Click(Sender: TObject);
var
i,j,k,m,n,a:integer;
ts,tk:string;
t:integer;
dbuf:array[1..17] of byte;
cbuf:array[1..17] of byte;
begin
t:=GetTickCount;
m:=FileCreate('c:/temp/test1.txt');
for i:=1 to 17 do
cbuf:=48;
cbuf[16]:=13;
cbuf[17]:=10;
CopyMemory(@dbuf,@cbuf,17)
//赋值
for j:=0 to 1000000 do
begin
ts:=inttostr(j);
n:=Length(ts);
i:=n;
a:=0;
repeat
tk:=copy(ts,i,1)
//取得字符
Dec(i);
dbuf[15-a]:=Ord(tk[1])
//转化
Inc(a);
until i=0;
k:=FileWrite(m,dbuf,17)
//写入
application.ProcessMessages;
end;
Form1.Caption:='计时'+Inttostr(GetTickCount-t);
end;
这个部分所用的时间比你的还要多,主要是因为中间的循环占用了很大的时间,分析你的
程序,同样的,循环占去了大部分的时间,不过我的程序应该还可以优化,比如说把17扩大
,中间的转化步骤简化,或把byte直接用char来等,但估计也快不了多少:)
**************************************************************************
另外,以下的程序供你参考,或许对你有启发,呵呵,你可将bs的值设大些与小点看看,
速度会有很大的差别:)
procedure TForm1.Button4Click(Sender: TObject);
const
bs=65536;
var
t:integer;
h1,h2:integer;
rs,ws:integer;
dbuf:array[1..bs] of byte;
begin
t:=GetTickCount;
h1:=FileOpen('c:/temp/test.txt',fmOpenReadWrite);
h2:=FileCreate('c:/temp/test1.txt');
repeat
rs:=FileRead(h1,dbuf,bs);
ws:=FileWrite(h2,dbuf,bs);
until rs<bs;
Form1.Caption:='计时'+Inttostr(GetTickCount-t);
end;
 
用TWriter TReader试试///
 
TWriter TReader在那个单元里定义的?
 
后退
顶部