プロが教える店舗&オフィスのセキュリティ対策術

100Mを超えるファイルを扱っています。
中のデータは突合せ処理に使用しており、何度もファイルの頭から最後まで読み込みます。
サイズがサイズなので、指定バイト数分取り出し、読み終わったら次の指定バイト数分取り出すといったことをやっております。
この処理を繰り返しますと、メモリの使用量がどんどん増大してしまいます。
ファイルの最後まで読み終わった後、一旦ファイルクローズして、読み直しているのですが、メモリが開放された気配はありません。

どのようにすれば、メモリ使用量を増やさずに処理することができますか?
ご教授お願いします。


ファイルのオープン/クローズには、
fopen_s()
fclose()

ファイルの中身を取得する際には
fread()
を使用しております。

メモリの使用量はタスクマネージャで確認しています。

A 回答 (5件)

メモリの使用量ってOSとプロセスのどっちの、どこを見てます?


見てる場所によっては見当違いですよ
    • good
    • 0

以下で確認してみましたが ・・・



コンソールアプリで作成
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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/29 17:36

ファイルを閉じないままどんどんオープンしてるような気がします。


fopen( );
while( 1 )
{

fseek( );

}
fclose( );
のようにオープン、クローズは1回にしてfseekのみ繰り返したらどうでしょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/29 17:33

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はサイズなど返しません。
読み込んだ要素の個数を返却します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/29 17:32

そのファイルを読み込んでいる部分などのソースを支障の無い範囲で公開しましょう



mallocなどで動的に確保しているのか
char buf[1024]などと制定な確保なのか ・・・

動的に確保しているなら freeで開放処理が必要です
newならdeleteで ・・・

この回答への補足

失礼しました。
書き直している部分もありますが、大体の処理の流れはこのような感じになります。

宜しくお願いします。
********************
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;// 全ての処理が終わったらループから抜ける。

}
********************

補足日時:2008/10/29 15:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!