• ベストアンサー

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

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

  • Windows10のメモリ使用率

    先日21H1の累積更新プログラム(KB5004945)のWin updateがありました。その際メモリ4GBと8GBの2台のPCで同時にアップデートをしたのですが、タスクマネージャで見ていると、4GBPCでは常時メモリ使用率が70%前後で3GB程度で収まっていましたが、8GBPCでは使用率50%前後で常に4GB以上使っていました。2台のPCのアイドル時メモリ使用量は2GB前後でほぼ同等です。 これを見ると同じプログラム処理をするのに8GBPCの方が1GB以上メモリを使っているように見えます。その分処理が高速化されるのでしょう。 Windowsはデバイスのメモリ総量を検知して実行プログラムのメモリ使用量を変えているのでしょうか? もしそうなら、メモリに余裕があってもメモリを増設すれば(多ければ多いほど)パフォーマンスがより向上することになりますが。

  • fread関数および動的なメモリ確保について

    こんにちは。 ファイルオープンし、fread関数にて1バイトずつ1024個をPktBuf配列へ格納し、sendto(winsock関数でUDPソケットの関数です)で1024Byteずつ送信しています。 #define DATA 1024 FILE *fp; char PktBuf[1024] fp = fopen(SEND_FILE_NAME,"rb+"); while((n = fread(PktBuf,1,DATA,fp)) != 0) {   sendto } fread(PktBuf,1,DATA,fp)の第2引数で、1と指定しているのですが・・・HPを参考にしているとsizeof(int)やsizeof(char)などが明記されている場合があるのですが、これは移植性を気にする場合に必要なことなのでしょうか? もし、第2引数のところを1から2へ変更した場合、2Byte×1024個=2048Byteとなり、配列[1024]に格納できないことを意味するのでしょうか? 最後に、fread関数およびmallocまたはcalloc関数を用いた、動的なメモリ確保について勉強しているのですが、記述方法がわからない状態です・・・現在の記述方法で問題はないのですが、動的なメモリ確保をすることが定説?と書かれていましたので、そちらも知りたいと思っています。 よろしくお願いします。

  • AIXでのメモリ使用率の計算

    各OSでのvmstatコマンドの出力からメモリ使用率を計算しようとしております。 Linuxの場合の使用可能なメモリサイズは free+buff+cache で計算されると思います。 Soralis8の場合はfreeのカラムの値にファイルシステムキャッシュに使用しているメモリも含まれるらしい(「Unixパフォーマンスチューニング」オライリー)ので、使用可能なメモリサイズは free のカラムの値を見ればいいと思います。 お伺いしたいのはAIXの場合なのですが、マニュアルを読む限り、freカラムの値には、ファイルシステムキャッシュのメモリが含まれていないらしく、使用可能なメモリサイズが見積もれません。 AIXの場合、どのようにして使用可能なメモリサイズを見積もるのが宜しいでしょうか? もしご存知の方がおられましたらご教示下さい。 宜しくお願いいたします。

  • 物理メモリとページファイル

    物理メモリを補助するものとして、ページファイルというものがありますよね。 タスクマネージャで使用状況を確認できますが、使用可能な物理メモリが2GB以上余っているのにページファイルを使っているようです。 これって何故なんでしょうか? 圧縮ファイルを50個ばかり用意して一気に解凍してみたりしたんですが、物理メモリの使用量は300MBぐらいしか増えていないのに、ページファイルは1GBを超える使用量になってました。 アクセスの早い物理メモリより、ページファイルを使って処理を遅くされているようで、どうも気分の良いものではありません。 もしかして、僕は何か勘違いしていますか? どなたか詳しく説明していただけないでしょうか? OSはWindowsXP SP3を使っています。

  • fcloseをしない場合のファイルポインタ

    一般的にファイル関連の処理をするとき $fh = fopen($tmp_file_name,"r"); 何か処理 fclose($fh); という感じで最後にfcloseをすると思います。 このfcloseをしない場合ってファイルポインタ(? 要はファイルへの参照、開いているという情報)はどうなるのでしょうか? 一般的なプログラムでDB接続をクローズし忘れたときみたいに接続だけが残って以後、参照不能やリソース不足に陥ったりするのでしょうか? それともスクリプトを実行し終えた瞬間に勝手に開放されるのでしょうか? flockについて考慮しない前提でお願いします。

    • ベストアンサー
    • PHP
  • zip形式ファイルのメモリ使用について。

    WS011SHを使用しています。 【データ記憶用メモリ】が極端に不足しているのですが、その原因が【zip形式のファイル】にあるということがわかりました。 zip形式のファイルを開くと、データ記憶用メモリがそのファイル分だけ使用されて少なくなります。しかし、そのファイルを閉じてもメモリは使用されたままになり、そのような状態が他のzip形式ファイルでも同様に起こるので、メモリ使用分が蓄積されてデータ記憶用メモリが不足していました。 この不足を解消する方法はあるのでしょうか? (一度開いたzip形式のファイルを削除してもメモリ使用分は減りませんでした。)

  • FILE オープンについて

    いつもお世話になります。 今ファイルデータ検索処理を検討しております。 今、search.txtには、 検索対象となるファイルパスが記載されています。 [search.txt] /home/hoge/SAMPLE1.jpg /home/hoge/SAMPLE2.jpg search.txtをfopen()し、1行ずつfgets()して、 得られるファイルパスより、そのファイルを fopen()して解析する処理がしたいですが、 fgets()より得られたファイルパスをfopen()し、 fread()するとセグメンテーションエラーになります。 どのようにしたらいいのでしょうか? 現状のコードを下記します。 FILE *fp; char *com1 = "/home/hoge/search.txt"; FILE *confp; char buf1[1024]; char buf2[1024]; int i =0; fp = fopen(com1, "r"); while( fgets(buf1, sizeof(buf1), fp )){ confp = fopen(buf1, "rb"); //*.JPGファイルをオープン //下記fread()でセグメンテーションエラー size_t size = fread( buf2, sizeof(char), 1024, confp ); for( i = 0; i<1024; i++ ){ if( (buf2[i] == 0xff) && (buf2[i+1] == 0xe0) ){ printf("%02x\n",buf[i+5]); } } } fclose(fp); fclose(confp); 上記のように、search.txtをfopen()し、読み込んだファイルパスを fopen()して、fread()読み込みをする方法を 教えて下さい。 どうぞよろしくお願い致します。

  • メモリページのファイルをふやす

    今日より頻繁に下のようなウォーニングが出てきます. 動作が遅く,作業がはかどりません. 「システムの仮想メモリが少なくなってきています. Windowsが正しく動作するために仮想メモリページファイルのサイズをふやしてください.」 どのようにしたらいいのでしょう. タスクマネージャでメモリの使用量を見ると,133メガです.当機はメモリを328メガ積んでいます.

  • ファイルの入力がうまくできません。

    ファイルの読み込みがうまくできません。 char buffer[起こりうる最大バイト数]; fread(buffer, 最大バイト数を超えないデータ量 で,うまく読み込めず、 buffer = (char *)malloc(必要なだけの領域) fread(buffer, 最大バイト数を超えないデータ量 だとうまくいきます。 最大バイト数は27*181と小さく、またbufferをstaticにしても 関数の外部においてもバグります。 いったいなにがおかしいのか、こころあたりあるかた教えてください。 ちなみに、fread直後ですでに読み込みデータがおかしくなっています 読み込みデータはバイナリでfopen("filename","br");でよんでます

  • Premiereでメモリ使用量を上げるには?

    以下のスペックのパソコンを使ってPremiereで編集作業を行っていますが、ムービー書き出し処理中ののメモリ使用量が約200MBとなっています。 OS: Win2000PRO CPU: Pen4 3GHz メモリ: 2GB メモリが2GBもあるのでもっと処理作業に使ってくれたら、と思っているのですが、例えばAfterEffectsでは環境設定からメモリ使用量を設定できるように、Premiereでも同様なメモリの設定はできないのでしょうか。 また、同じプロジェクトファイルでも音声が一瞬途切れる事象も発生しています。(書き出すたびに異なる場所が途切れます) これはメモリが効率的に使われていないことも一因として考えられるでしょうか。 どなたかご存知の方がいれば宜しくお願いします。

専門家に質問してみよう