ファイル読み込みの高速化

解決


nico  2014-01-14 12:03:34  No: 45886

バイナリファイルの読み込みにおいて、うまく読み込めたのですが、時間がかかりすぎて困っています。
やりたいことは、一つのバイナリファイルには、8ビットごとに3個データが順に並んでおり、それらを三つの配列にに分割して読み込みたいです。
何かよい方法はありますでしょうか?
ちなみに以下のコードで目的は達成していますが、一つ一つをReadして言っているために速度がどうしても遅いようです。よろしくお願いいたします。

  Assignfile(raw_file,filepath);
  Reset(raw_file);
  Seek (raw_file,start_p);
  length:=y_mtx*x_mtx;
  n:=0;
  while n < length do
  begin
    read(raw_file,b_data[n]);
    read(raw_file,g_data[n]);
    read(raw_file,r_data[n]);
    n:=n+1;
  end;
 CloseFile(raw_file);


Quest  2014-01-14 12:56:21  No: 45887

もっとスマートな方法もあるだろうけど
こんな感じでどうでしょう?
var
  buf: array of byte;
  len, ix: integer;
begin
  Assignfile(raw_file,filepath);
  Reset(raw_file, 1);
  Seek (raw_file,start_p);
  len := y_mtx * x_mtx * 3;
  SetLength(buf, len);
  read(raw_file, buf, len);
  CloseFile(raw_file);
  n := 0;
  ix := 0;
  while ix < len do
  begin
    b_data[n] := buf[ix];
    g_data[n] := buf[ix+1];
    r_data[n] := buf[ix+2];
    Inc(n);
    Inc(ix, 3);
  end;
end;
構文のチェックしてないから、エラーでるかも(^^;

要は、必要な分を先にまとめて読み込んでしまって
メモリ上で仕訳しましょうって話です。


nico  2014-01-16 15:27:36  No: 45888

アドバイスありがとうございます。
教えていただいた方法を参考に修正いたしました。
一度すべて読み込んでから分割すれば、処理速度が劇的に改善されました。
ありがとうございました。


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

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






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