AssignFileを利用した読込を高速化するには?

解決


なすか  2007-06-16 01:24:08  No: 26686

先日はありがとうございました。
その件と関係あることなのですが、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;


ううう  2007-06-16 02:15:12  No: 26687

procedure TFileRead.Execute(lines: TStrings); //引数追加

  lines.BeginUpdate; //追加

  AssignFile( F1, Filename );
  〜〜〜
    Readln( F1, msg );  //変更
    lines.Add(msg); //追加
    (プログレスバー.step;)
  〜〜〜
  CloseFile( F1 );  

  lines.EndUpdate; //追加


Basser  2007-06-16 02:20:15  No: 26688

一度に全部書き込まず、ある程度のサイズで書き込んでみてください。

  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;


なすか  2007-06-16 03:48:00  No: 26689

ありがとうございました。
BlockReadを使用することで無事解決しました。


なすか  2007-06-17 03:45:08  No: 26690

参考までに処理時間を書いておきます。

読込テキスト  20.9MB 658590行
TMemo.lines.loadfromfile(20秒) 合計20秒
BlockReadからmsgに統合(16秒) >> Tmemo.Linesへ一括書込(18秒) 34秒
Basserさんのコード(Tmemo.Linesへ分割書込) 85秒

直接LoadFromFileで読み込むのが一番速いみたいですね。
定石通り、余計な処理はするなってことでしょう。
個人的にはメモリ上にあるmsgからTmemoへ入力するのに、
なぜこんなに時間を食うのかというのが疑問だったりしますが。

ううう様、Basser様  ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加