先日はありがとうございました。
その件と関係あることなのですが、TMemo.lines.loadfromfileを使用するよりも
AssignFileを使用して読み込んだほうが圧倒的に読込が遅くなってしまいました。
高速化のためにいろいろ考えてみたりしたのですが、上手くいきません。
高速化するにはどうしたらよいのでしょうか?
申し訳ありませんが、また知恵をお貸しください。
以下読込用スレッドのコードです。
procedure TFileRead.Execute;
var
F1: TextFile;
Ch: char;
filename : string;
msg : string;
begin
AssignFile( F1, Filename );
msg :='';
Reset( F1 );
while not Eof( F1 ) do
begin
Read( F1, Ch );
msg := msg + chr(Ord( Ch ));
end;
Synchronize(write);
CloseFile( F1 );
end;
procedure TFileRead.write;
begin
Form1.Memo1.Lines.Add(msg);
end;
procedure TFileRead.Execute(lines: TStrings); //引数追加
lines.BeginUpdate; //追加
AssignFile( F1, Filename );
〜〜〜
Readln( F1, msg ); //変更
lines.Add(msg); //追加
(プログレスバー.step;)
〜〜〜
CloseFile( F1 );
lines.EndUpdate; //追加
一度に全部書き込まず、ある程度のサイズで書き込んでみてください。
procedure TFileRead.Execute;
const
TEXTSIZE = 65536;
var
F1: TextFile;
filename : string;
msg, LineBuf: String;
begin
AssignFile(F1, Filename );
msg:= '';
Reset(F1);
while not Eof(F1) do
begin
Readln(F1, LineBuf);
msg:= msg + LineBuf + #13#10
if (Length(msg) >= TEXTSIZE) or Eof(F1) then
begin
Synchronize(write);
msg:= '';
end;
end;
CloseFile( F1 );
end;
ありがとうございました。
BlockReadを使用することで無事解決しました。
参考までに処理時間を書いておきます。
読込テキスト 20.9MB 658590行
TMemo.lines.loadfromfile(20秒) 合計20秒
BlockReadからmsgに統合(16秒) >> Tmemo.Linesへ一括書込(18秒) 34秒
Basserさんのコード(Tmemo.Linesへ分割書込) 85秒
直接LoadFromFileで読み込むのが一番速いみたいですね。
定石通り、余計な処理はするなってことでしょう。
個人的にはメモリ上にあるmsgからTmemoへ入力するのに、
なぜこんなに時間を食うのかというのが疑問だったりしますが。
ううう様、Basser様 ありがとうございました。
ツイート | ![]() |