• ベストアンサー

ファイルクローズとメモリ使用率について

100Mを超えるファイルを扱っています。 中のデータは突合せ処理に使用しており、何度もファイルの頭から最後まで読み込みます。 サイズがサイズなので、指定バイト数分取り出し、読み終わったら次の指定バイト数分取り出すといったことをやっております。 この処理を繰り返しますと、メモリの使用量がどんどん増大してしまいます。 ファイルの最後まで読み終わった後、一旦ファイルクローズして、読み直しているのですが、メモリが開放された気配はありません。 どのようにすれば、メモリ使用量を増やさずに処理することができますか? ご教授お願いします。 ファイルのオープン/クローズには、 fopen_s() fclose() ファイルの中身を取得する際には fread() を使用しております。 メモリの使用量はタスクマネージャで確認しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

以下で確認してみましたが ・・・ コンソールアプリで作成 1) 単にファイルから読み込んで 2) 読み込み成功したら閉じてまた開き シークして次を読む 3) ファイルの末尾まで 2)へ戻って繰り返し 4) 上記 1)から3)を 1000回繰り返す タスクマネージャでのプロセスで確認 ・・・ 参考コード VC2005 #include "stdafx.h" // stdio.h, tchar.h をインクリュード int _tmain(int argc, _TCHAR* argv[]) {   char buf[20481];   FILE *file1;   errno_t err;   unsigned _int64 nPos = 0L;   unsigned _int64 readcnt = 0L;   for( int n = 0; n < 1000; n ++ ) {     printf( "%d\n", n );     err = fopen_s( &file1, "Gallery.zip", "rb" );     if ( err != 0 ) {      printf( "FileOpen Error\n" );       return 1;     }     memset( buf, 0, sizeof( buf ) );     readcnt = fread( buf, 1, sizeof( buf ), file1 );     nPos = readcnt;     while( !feof( file1 ) ) {       fclose( file1 );       if ( 0 == fopen_s( &file1, "Gallery.zip", "rb" ) ) {         memset( buf, 0, sizeof( buf ) );         _fseeki64( file1, nPos, SEEK_SET );         fread( buf, 1, sizeof( buf ), file1 );         nPos += readcnt;       } else {         return 2;       }     }     fclose( file1 );   }   return 0; }

mikami532
質問者

お礼

コードまで記載していただいてありがとうございます。 上記コードを確認の後、自コードと見比べてみることにします。

その他の回答 (4)

noname#208124
noname#208124
回答No.5

メモリの使用量ってOSとプロセスのどっちの、どこを見てます? 見てる場所によっては見当違いですよ

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

ファイルを閉じないままどんどんオープンしてるような気がします。 fopen( ); while( 1 ) { fseek( ); } fclose( ); のようにオープン、クローズは1回にしてfseekのみ繰り返したらどうでしょう

mikami532
質問者

お礼

ご指摘ありがとうございます。 転記する際に転記ミスがあったようです。 本当にすみません。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

if ( feof(file1) ) { fclose(file1); ~ } ファイルポインタが終端に移動していいない場合。 このループはfcloseせずにfopenを続けますが良いのでしょうか? errno_t err; err = fopen_s( &file1, "ファイルパス", "r" ); if(err != 0) { printf("ファイルを開けません。\n"); fclose(file1); exit(1); } 上記の処理はループの外でいいはのでは? 蛇捉ですが、上のコードでfopenに失敗しているにもかかわらず、 fclose(file1)しています。開いてない物を閉じることはできません。 また、read_size = freadとありますがfreadはサイズなど返しません。 読み込んだ要素の個数を返却します。

mikami532
質問者

お礼

ご指摘ありがとうございます。 プログラムより転記する際にミスがあったようです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

そのファイルを読み込んでいる部分などのソースを支障の無い範囲で公開しましょう mallocなどで動的に確保しているのか char buf[1024]などと制定な確保なのか ・・・ 動的に確保しているなら freeで開放処理が必要です newならdeleteで ・・・

mikami532
質問者

補足

失礼しました。 書き直している部分もありますが、大体の処理の流れはこのような感じになります。 宜しくお願いします。 ******************** FILE *file1;//ファイル unsigned __int64 position = 0L;// 読み込み位置 char read_buf[204801];//読み込みバッファ int read_size; ・ ・ ・ while(1) { ・ ・ ・ errno_t err; err = fopen_s( &file1, "ファイルパス", "r" ); if(err != 0) { printf("ファイルを開けません。\n"); fclose(file1); exit(1); } ・ ・ ・ memset(read_buf, 0x00, sizeof(read_buf)); _fseeki64(file1, position, SEEK_SET); read_size = fread(read_buf, 1, 204801, file1); ・ ・ ・ position = position + 204801; if ( feof(file1) ) { fclose(file1); position = 0; err = fopen_s( &file1, "ファイルパス", "r" ); if(err != 0) { printf("ファイルを開けません。\n"); fclose(file1); exit(1); } } ・ ・ ・ break;// 全ての処理が終わったらループから抜ける。 } ********************

関連するQ&A