fopen を高速化するには


yuu  2004-03-27 04:45:46  No: 53403

先日Qを投げたばかりですが、再度Qを投げさせてください。

現在、10分毎に起動し、約228Kbyteのファイルを約1600個取得し、
20程度のファイルに出力する処理。  を開発しております。

当プログラムを走らせたところ、デバッグ環境において約15分もかかってしまいました。
VC++6.0のプロファイル機能を用いて処理の分散率を計測したところ、
fopenを行う関数内で、出来るだけ処理を高速化したにもかかわらず、
12分もの時間がかかっておりました。

ここで質問なのですが、以下の処理を更に高速化することは可能でしょうか。
ご教授お願いいたします。

int  DatGetFromFile( char *cFileName )
{
  FILE  *fp;

  /* ファイル名を作成 */
  if((fp=fopen(cFileName, "rb"))==NULL)
  {
    return ERR_FILE_OPEN;
  }
  else
  {
    /* 一括取得 */
      fread( gcFileData, sizeof(char), sizeof(gcFileData) - 1, fp);
      if(ferror(fp) != 0)
    {
      return ERR_FILE_READ;
    }

  }

  fclose(fp);

  return(NORMAL);
}

※  gcFileData  にはファイルを一括取得できるバッファサイズ(228KByte)が用意されています。
※  MFCでのデバッグを行いましたが、実際に稼働する環境はUNIX(SunOS 5.8)です。  よって  CFileクラス等を使うことはできません。


シャノン  2004-03-27 05:55:01  No: 53404

もっと複雑なルーチンを単純化するとかならば高速化も見込めますが、ここまでシンプルだと改善のしようがないような気がします。

ならば、あとはメモリを浪費する方向に走るか、もっと根本的に変えるか…。

例えば、fopen と fclose が遅くて、毎回開くファイルが決まっているなら、プログラム起動しっぱなし、ファイル開きっぱなしにするとか。
同時に開けるファイル数の制限とかあったら無理ですね…

例えば、ファイルフォーマットを変えて複数のファイルをひとつにまとめ、fopen と fclose の回数を減らすとか。

#全部インラインアセンブラで書くなんていう無茶もありますが、おすすめしません。

>MFCでのデバッグを行いましたが、実際に稼働する環境はUNIX(SunOS 5.8)です。  よって  CFileクラス等を使うことはできません。
MFC でのデバッグではなく、VC++ でのデバッグだと思います。


岡田 之仁  2004-03-29 18:40:23  No: 53405

あくまで参考ですが・・・

Win32 API の方を使ってみるとか、また、システムがファイルの
リード・ライトに使用するバッファを、許可・不許可するとか。

またそのバッファの大きさを調整してみるとか・・・

試行錯誤する手はまだあると思います。

バッファの制御はWin32 API側にありますが、MFCやライブラリ内
にあったかについては未確認です。

バッファサイズについては、OSに依存します。

●  最終の稼動環境が、UNIXであると書かれています。
    とすると、Windows上でデバッグしても無意味では?
    UNIX環境でもバッファリング制御はC言語で用意されて
    いたと思いますが、手元に環境が無いので、確認できません。

    よって、あくまで試行錯誤して頂くしかないと思います。

以上。


RiSK  2004-03-29 19:58:53  No: 53406

> またそのバッファの大きさを調整してみるとか・・・

> バッファの制御はWin32 API側にありますが、MFCやライブラリ内
> にあったかについては未確認です。

Cの標準関数に
  setbuf
  setvbuf
というのがあります。

setbuf より setvbuf が勧められているようです。(VCの話ですが)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt_setvbuf.asp


たく  2004-03-31 01:28:17  No: 53407

1600個のファイルを処理して12分ってことは、
1ファイルあたりの処理が0.45秒。

妥当なせんだと思いますが


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

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






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