
100Mを超えるファイルを扱っています。
中のデータは突合せ処理に使用しており、何度もファイルの頭から最後まで読み込みます。
サイズがサイズなので、指定バイト数分取り出し、読み終わったら次の指定バイト数分取り出すといったことをやっております。
この処理を繰り返しますと、メモリの使用量がどんどん増大してしまいます。
ファイルの最後まで読み終わった後、一旦ファイルクローズして、読み直しているのですが、メモリが開放された気配はありません。
どのようにすれば、メモリ使用量を増やさずに処理することができますか?
ご教授お願いします。
ファイルのオープン/クローズには、
fopen_s()
fclose()
ファイルの中身を取得する際には
fread()
を使用しております。
メモリの使用量はタスクマネージャで確認しています。
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;
}
No.3
- 回答日時:
ファイルを閉じないままどんどんオープンしてるような気がします。
fopen( );
while( 1 )
{
fseek( );
}
fclose( );
のようにオープン、クローズは1回にしてfseekのみ繰り返したらどうでしょう
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はサイズなど返しません。
読み込んだ要素の個数を返却します。
No.1
- 回答日時:
そのファイルを読み込んでいる部分などのソースを支障の無い範囲で公開しましょう
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;// 全ての処理が終わったらループから抜ける。
}
********************
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
Access2010の最適化設定について
-
vba ActiveSheet.pasteを使った...
-
ダイアログボックスで複数フォ...
-
fopenの"r+"モードで同時に読み...
-
ファイルの結合
-
マスタとファイルの違いって?
-
テキストファイルの最終行を削...
-
RPGでファイル名(もしくはレコ...
-
Cでのネットワークファイルの読...
-
ドラッグアンドドロップでファ...
-
.eml形式のファイル
-
C言語のfopenについて教えてく...
-
2つのCSVファイルの比較
-
ファイルクローズとメモリ使用...
-
BLOCK構造体とFORTRAN
-
fopenできる上限の変更
-
SGファイルって何ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
VB.NETによるプロセス間通信
-
営業秘密の漏洩について
-
Thunderbirdでemlファイルを開...
-
ドラッグアンドドロップでファ...
-
CSVファイルへの保存の際、デー...
-
バッチで118項目のCSVを処理し...
-
SGファイルって何ですか?
-
ファイルの結合
-
分割コンパイルの#defineについて
-
VBAにてEXCEL以外のファイル(テ...
-
2つのCSVファイルの比較
-
ShellExecuteEx→WaitForSingleO...
-
VBに、Cのincludeのようなもの...
-
RPGでファイル名(もしくはレコ...
-
マウスポインタの変更
-
Excelマクロでの再読込み方法
-
関数の呼び方について
おすすめ情報